C++ 对不同类型使用具有不同返回的模板函数不会';行不通
所以我写了这样的东西:C++ 对不同类型使用具有不同返回的模板函数不会';行不通,c++,templates,return-type,C++,Templates,Return Type,所以我写了这样的东西: class MyClass { enum varType {INTEGER, DOUBLE, VECTOR}; int beautiful_integer; double awesome_double; std::vector<float> many_floats; template <class T> T getVariable(varType type) {
class MyClass
{
enum varType {INTEGER, DOUBLE, VECTOR};
int beautiful_integer;
double awesome_double;
std::vector<float> many_floats;
template <class T>
T getVariable(varType type)
{
if(type == INTEGER)
{
return beatiful_integer;
}
if(type == DOUBLE)
{
return awesome_double;
}
if(type == VECTOR)
{
return many_floats;
}
}
...
};
我想将
beautiful\u integer
的值分配给一些在编译时确定的模板参数。您可以通过模板专门化来完成它。不要使用enum
。e、 g
class MyClass
{
int beautiful_integer;
double awesome_double;
std::vector<float> many_floats;
template <class T>
T getVariable();
template<>
int getVariable<int>
{
return beatiful_integer;
}
template<>
double getVariable<double>
{
return awesome_double;
}
template<>
std::vector<float> getVariable<std::vector<float>>
{
return many_floats;
}
};
class-MyClass
{
整数;
双倍;
向量多个浮点数;
模板
T getVariable();
模板
int getVariable
{
返回美好的_整数;
}
模板
双getVariable
{
双倍回报;
}
模板
std::vector getVariable
{
返回多个浮点数;
}
};
在C++17中,您还可以使用
模板
T getVariable()
{
如果constexpr(std::is_same_v)
{
返回美好的_整数;
}
否则,如果constexpr(std::is_same_v)
{
双倍回报;
}
否则,如果constexpr(std::is_same_v)
{
返回多个浮点数;
}
其他的
{
...
}
}
然后
MyClass一些_类;
int some_number=some_class.getVariable();
顺便说一句:MyClass some_class()代码>没有达到您期望的效果。参见。作为备选方案,标准:
template <class T>
const T& getVariable() const
{
return std::get<const T&>(std::tie(beautiful_integer, awesome_double, many_floats));
}
template <class T>
T& getVariable()
{
return std::get<T&>(std::tie(beautiful_integer, awesome_double, many_floats));
}
模板
常量T&getVariable()常量
{
return std::get(std::tie(漂亮的整数,很棒的双精度,许多浮点数));
}
模板
T&getVariable()
{
return std::get(std::tie(漂亮的整数,很棒的双精度,许多浮点数));
}
非常感谢您!我想我没有完全理解如何使用这样的模板+你的解决方案解释得非常清楚;没有括号。通常我的编译器会提醒我;P但是令人烦恼的解析是一个有趣的问题,为什么函数不按值返回(就像OP的成员模板一样)@水飲み鳥: 我不喜欢按值返回std::vector
。您仍然可以通过类似于typename boost::call_traits::param_type
的方法来改进它,而不是在返回类型中使用const T&
。感谢您的解释。
template <class T>
T getVariable()
{
if constexpr (std::is_same_v<T, int>)
{
return beatiful_integer;
}
else if constexpr (std::is_same_v<T, double>)
{
return awesome_double;
}
else if constexpr (std::is_same_v<T, std::vector<float>>)
{
return many_floats;
}
else
{
...
}
}
MyClass some_class;
int some_number = some_class.getVariable<int>();
template <class T>
const T& getVariable() const
{
return std::get<const T&>(std::tie(beautiful_integer, awesome_double, many_floats));
}
template <class T>
T& getVariable()
{
return std::get<T&>(std::tie(beautiful_integer, awesome_double, many_floats));
}