假设我有一个名为 Compute
的类模板, 和另一个名为 Function_A
的类使用成员函数模板:
template <typename T> void Evaluate(T parameter)
我只能使用类 Function_A
事实上。我已经知道 T
只能是两种类型之一 type_1
和 type_2
.
有没有办法得到类似于Compute<T> C
的东西?作为Function_A
的成员变量而不是定义本地 Compute<T>
里面的物体 Evaluate(...)
?我知道这违背了使用模板的理念,因此这可能是不可能的,但在这种情况下可以理想地完成吗?
我试着有两个成员Compute<type_1> C1
和 Compute<type_2> C2
在 Function_A
, 然后在 if (typeid(T) == typeid(type_1))
下使用它们但它非常可怕,并且也违背了使用模板的理念。
只是为了说明我的意思:
template <class T>
class Compute
{
public:
T Function_B(T parameter)
{
return f.eval(parameter);
}
private:
SomeClass<T> f;
}
还有一个类:
class Function_A
{
public:
template <typename T> T Evaluate(T parameter)
{
Compute<T> C; //this is very expensive!
T value = C.Function_B(parameter);
return value;
}
private:
double SomeParameter;
//Compute<T> C; //conceptually what I want
}
最佳答案
怎么样(未测试):
class Function_A
{
public:
template <typename T> void Evaluate(T parameter)
{
T value = std::get<Compute<T>>(computers).Function_B(parameter);
return T(SomeParameter) * value;
}
private:
double SomeParameter;
std::tuple<Compute<type_1>, Compute<type_2>> computers;
};
备注:std::pair
将与 std::tuple
完全相同在这里,如果你喜欢它添加的第一/第二语义。
此外,请注意 T(SomeParameter)
是 C 风格的转换,如果 T
可能会有问题不是类类型。考虑 T{}
或 static_cast<T>()
.
关于c++ - 有没有办法在非模板类中定义模板成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55357639/