c++ - 有没有办法在非模板类中定义模板成员?

标签 c++ class templates

假设我有一个名为 Compute 的类模板, 和另一个名为 Function_A 的类使用成员函数模板:

template <typename T> void Evaluate(T parameter)

我只能使用类 Function_A事实上。我已经知道 T只能是两种类型之一 type_1type_2 .

有没有办法得到类似于Compute<T> C的东西?作为Function_A的成员变量而不是定义本地 Compute<T>里面的物体 Evaluate(...) ?我知道这违背了使用模板的理念,因此这可能是不可能的,但在这种情况下可以理想地完成吗?

我试着有两个成员Compute<type_1> C1Compute<type_2> C2Function_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/

相关文章:

C++着色器问题

c++ - QImage:使用颜色表从灰度转换为 RGB

java - 如何忽略java文件名?

c++ - 非类型模板参数中的C++类类型:推导指南失败

javascript - 具有特定范围的angularjs部分模板

c# - 从 C# 调用 Excel/DLL/XLL 函数

c++ - 将 char* 转换为 std::vector

python - 如何扩展 Django "login"表单?

c++ - Doxygen 如何按路径分隔类?

c++ - 默认模板参数在(部分特化的)类模板的重载决议中的作用