根据参数返回类型

时间:2015-05-06 22:45:23

标签: c++ templates c++11 metaprogramming

我希望有这样一个函数,它的返回类型将在函数内决定(取决于参数的),但实现失败。 (模板专业化可能吗?)

// half-pseudo code
auto GetVar(int typeCode)
{
  if(typeCode == 0)return int(0);
  else if(typeCode == 1)return double(0);
  else return std::string("string");
}

我想在不指定类型的情况下使用它:

auto val = GetVar(42); // val's type is std::string

3 个答案:

答案 0 :(得分:1)

这不起作用,你必须在编译时给出参数。以下方法可行:

template<int Value>
double GetVar() {return 0.0;};

template<>
int GetVar<42>() {return 42;}

auto x = GetVar<0>(); //type(x) == double
auto y = GetVar<42>(); //type(x) == int

另一个版本是传递std :: integral_constant,如下所示:

template<int Value>
using v = std::integral_constant<int, Value>;

template<typename T>
double GetVar(T) {return 0;};

int GetVar(v<42>) {return 42;};

auto x = GetVar(v<0>()); //type(x) == double
auto y = GetVar(v<42>()); //type(x) == int

答案 1 :(得分:0)

由于c ++是面向对象的,我们可以让所有选项从父类继承,然后返回该父类的实例。
或者,我们可以尝试void * return类型。

答案 2 :(得分:0)

#include <type_traits>
#include <iostream>

// foo1 overloads are enabled via the return type
template<class T>
typename std::enable_if<std::is_floating_point<T>::value, T>::type 
foo1(T t) 
{
    std::cout << "foo1: float\n";
    return t;
}