【问题标题】:How to create a template function within a class? (C++)如何在类中创建模板函数? (C++)
【发布时间】:2010-11-01 14:39:43
【问题描述】:

我知道可以制作模板函数:

template<typename T>
void DoSomeThing(T x){}

并且可以制作模板类:

template<typename T>
class Object
{
public:
    int x;
};

但是是否可以在模板中创建一个类,然后在该类中创建一个函数作为模板?即:

//I have no idea if this is right, this is just how I think it would look
class Object
{
public:
    template<class T>
    void DoX(){}
};

或某种程度,类不是模板的一部分,但函数是?

【问题讨论】:

    标签: c++ templates function class


    【解决方案1】:

    你的猜测是正确的。唯一需要记住的是成员函数模板definition(除了声明)应该在头文件中,而不是在cpp中,尽管它确实not必须在类声明本身的主体中。

    【讨论】:

    • 而且你不能专门化它们。 :-(
    • 不完全正确。定义可以在 cpp 文件中,只要在定义后对来自非模板函数/方法的每个唯一模板参数 n-uplet 调用一次。
    • 因此我的“应该” - 将其保留在标题中是实现这一目标的最简单方法。
    • 其实我相信你可以明确地特化它们,但你不能部分特化它们。不幸的是,我不知道这是特定于编译器的扩展,还是 C++ 标准。
    • 它实际上是标准的 c++。你可以做 struct A { template void f(); };模板 void A::f() { } 例如。您只是不能将它们专门用于类范围,但是在命名空间范围内完成时可以做得很好。 (不要与专业化实际放入的范围相混淆:专业化仍然是类的成员 - 但它的定义是在命名空间范围内完成的。通常放入某些东西的范围与范围相同有些东西是在 - 但有时不是真的,就像在所有的类外定义的情况下一样)
    【解决方案2】:

    参见此处:Templatestemplate methods,成员模板、成员函数模板

    class   Vector
    {
      int     array[3];
    
      template <class TVECTOR2> 
      void  eqAdd(TVECTOR2 v2);
    };
    
    template <class TVECTOR2>
    void    Vector::eqAdd(TVECTOR2 a2)
    {
      for (int i(0); i < 3; ++i) array[i] += a2[i];
    }
    

    【讨论】:

    • 很好的例子。但是为什么 template 在类 definitino...???
    • @Martian2049 我相信这是模板仅适用于类中的成员函数,而不适用于整个类。正如 OP 所要求的那样。
    【解决方案3】:

    是的,模板成员函数在许多场合都是完全合法且有用的。

    唯一需要注意的是模板成员函数不能是虚拟的。

    【讨论】:

      【解决方案4】:

      最简单的方法是将声明和定义放在同一个文件中,但可能会导致可执行文件过大。例如

      class Foo
      {
      public:
      template <typename T> void some_method(T t) {//...}
      }
      

      此外,可以将模板定义放在单独的文件中,即将它们放在 .cpp 和 .h 文件中。您需要做的就是将模板实例化显式包含到 .cpp 文件中。例如

      // .h file
      class Foo
      {
      public:
      template <typename T> void some_method(T t);
      }
      
      // .cpp file
      //...
      template <typename T> void Foo::some_method(T t) 
      {//...}
      //...
      
      template void Foo::some_method<int>(int);
      template void Foo::some_method<double>(double);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多