根据参数返回类型
Returning a type depending on the parameter
我想有这样一个函数,它的return类型将在函数内决定(取决于参数的值),但实现失败. (可能是模板专业化?)
// 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
由于 c++ 是面向对象的,我们可以让所有选项继承自父 class,然后 return 该父 class 的实例。
或者我们可以尝试 void * return 类型。
那不行,你必须在编译时给参数。以下将起作用:
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
#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;
}
我想有这样一个函数,它的return类型将在函数内决定(取决于参数的值),但实现失败. (可能是模板专业化?)
// 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
由于 c++ 是面向对象的,我们可以让所有选项继承自父 class,然后 return 该父 class 的实例。
或者我们可以尝试 void * return 类型。
那不行,你必须在编译时给参数。以下将起作用:
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
#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;
}