带模板的条件返回类型

时间:2017-01-05 23:30:20

标签: c++ templates conditional

我想在C ++中使用与模板相关的条件返回类型。 我的环境中提供了C ++ 11,14和 17预览

我不是编程新手,但我是C ++的新手,并且对某些功能感到困惑。

我想要实现的目标是:

如果模板为int32_t,则我的返回类型为int64_tint16_t将返回int32_tint8_t将返回int16_t

实际上我正在使用通用模板:

template <class T, class T2>
static T2 Foo(T bar1, T bar2) { //do something }

int64_t x = Foo<uint32_t, uint64_t>(555555, 666666);

我想通过只输入参数类型来使这更加实用。

int64_t x = Foo<uint32_t>(555555, 666666);
int32_t x = Foo<uint16_t>(12000, 13000;
int16_t x = Foo<uint8_t>(88, 99);

我尝试用std::conditional实现它:

template<typename OtherType,
        typename T = typename std::conditional<(sizeof(Type) <=   
        sizeof(OtherType)),
        OtherType, Type>::type>

我愿意使用重载和疯狂的想法。

2 个答案:

答案 0 :(得分:6)

在C ++中使用特征的惯用方法是使用特征 举个例子:

template<typename> struct foo_ret;
template<> struct foo_ret<uint32_t> { using type = uint64_t; };
template<> struct foo_ret<uint16_t> { using type = uint32_t; };
// And so on...

现在甚至不再需要返回类型的模板参数:

template <class T>
static typename foo_ret<T>::type Foo(T bar1, T bar2) {};

您可以按照要求调用它:

int64_t x = Foo<uint32_t>(555555, 666666);

或者如果您愿意,让编译器推导出T

答案 1 :(得分:1)

您可以尝试使用编译时间图来获取所需的返回类型

typedef boost::mpl::map<
    boost::mpl::pair<uint32_t,uint64_t>,
    boost::mpl::pair<uint16_t,uint32_t>,
    boost::mpl::pair<uint8_t,uint16_t>
> type_map_t;

template <typename T>
typename boost::mpl::at<type_map_t,T>::type Foo(T bar1, T bar2) {}