如何在类中创建模板函数?(C++)

140 c++ templates class function

我知道可以制作模板功能:

template<typename T>
void DoSomeThing(T x){}
Run Code Online (Sandbox Code Playgroud)

并且可以创建模板类:

template<typename T>
class Object
{
public:
    int x;
};
Run Code Online (Sandbox Code Playgroud)

但是可以创建一个不在模板中的类,然后在该类中创建一个模板的函数吗?即:

//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(){}
};
Run Code Online (Sandbox Code Playgroud)

或类似的程度,类不是模板的一部分,但功能是?

Not*_*ure 112

你的猜测是正确的.你要记住的唯一的事情是,成员函数模板定义(除声明外)应在头文件,而不是CPP,虽然它并没有一定要在类声明本身的身体.

  • 不完全正确.该定义可以在cpp文件中,只要在定义后从非模板函数/方法为每个唯一模板参数n-uplet调用一次. (7认同)
  • 它实际上是标准的c ++.你可以做struct A {template <typename> void f(); }; template <> void A :: f <int>(){}例如.你不能在类范围内专门化它们,但是在命名空间范围内完成时你可以做得很好.(不要混淆实际放入专门化的范围:专门化仍然是类的成员 - 但它的定义是在命名空间范围内完成的.通常放置内容的范围与范围相同定义了某些东西 - 但有时不是这样,因为在所有类外定义的情况下都是如此) (7认同)
  • 实际上,我相信你可以明确地将它们专门化,但你不能对它们进行部分专业化.不幸的是,我不知道这是否是特定于编译器的扩展或C++标准. (4认同)
  • 而且你也不能把它们专门化.:-( (3认同)
  • 因此,我的“应该” - 将它保存在标题中是实现这一目标的最简单方法。 (2认同)

non*_*one 68

请参阅此处:模板,模板方法,成员模板,成员函数模板

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];
}
Run Code Online (Sandbox Code Playgroud)

  • @Martian2049我相信这是因为模板仅适用于类中的成员函数,而不适用于整个类。正是正如OP所要求的。 (2认同)

Tob*_*ias 19

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

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


hey*_*hey 17

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

class Foo
{
public:
template <typename T> void some_method(T t) {//...}
}
Run Code Online (Sandbox Code Playgroud)

此外,可以将模板定义放在单独的文件中,即将它们放在 .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);
Run Code Online (Sandbox Code Playgroud)