基于模板参数选择函数名称 [英] Select function name based on template parameter

查看:138
本文介绍了基于模板参数选择函数名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有办法根据模板参数在多个非模板函数之间自动选择?

Is there a way to automatically select between multiple non-template functions based on a template parameter?

示例:

class Aggregate
{
public:
     std::string asString();
     uint32_t asInt();
private:
     // some conglomerate data
};

template <typename T>
T get(Aggregate& aggregate)
{
     // possible map between types and functions?
     return bind(aggregate, typeConvert[T])(); ??
     // or
     return aggregate.APPROPRIATE_TYPE_CONVERSION();
}

如果没有良好的转换,解决方案会抛出编译器错误可用,即

The solution would be nice to throw a compiler error if there is no good conversion available, i.e.

get<double>(aggregate); // compile error

我不想使用模板专门化,例如

I do not want to use template specialization, i.e

template<>
int get(Aggregate& aggregate)
{
    return aggregate.asInt();
}

因为它会导致代码重复,当你的get代码行

because it leads to code duplication when your get() function has more then one line of code

推荐答案

您可以执行类似(require C ++ 11):( https://ideone.com/UXrQFm

You may do something like (require C++11) : (https://ideone.com/UXrQFm)

template <typename T, typename... Ts> struct get_index;

template <typename T, typename... Ts>
struct get_index<T, T, Ts...> : std::integral_constant<std::size_t, 0> {};

template <typename T, typename Tail, typename... Ts>
struct get_index<T, Tail, Ts...> :
    std::integral_constant<std::size_t, 1 + get_index<T, Ts...>::value> {};

template <typename T, typename Tuple> struct get_index_in_tuple;

template <typename T, typename ... Ts>
struct get_index_in_tuple<T, std::tuple<Ts...>> : get_index<T, Ts...> {};


class Aggregate
{
public:
     std::string asString();
     uint32_t asInt();
private:
     // some conglomerate data
};

template <typename T>
T get(Aggregate& aggregate)
{
    using types = std::tuple<uint32_t, std::string>;
    auto funcs = std::make_tuple(&Aggregate::asInt, &Aggregate::asString);

    return (aggregate.* (std::get<get_index_in_tuple<T, types>::value>(funcs)))();
}

这篇关于基于模板参数选择函数名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆