列出所有可能的模板实现的C++变通方法

C++ Workaround for listing all possible template implementations

本文关键字:C++ 方法 实现 有可能      更新时间:2023-10-16

我有一个使用模板的多文件项目。

// Foo.h
template <class T>
class Foo
{
    T bar;
};

我有一个类(例如Cup)和该类的一堆子类。

// Cup.h
class Cup
{
};
class Chalice : public Cup
{
};
class SippyCup : public Cup
{
};
// ...etc.

在模板的.cpp文件中,我需要列出所有可能的模板实现,以避免链接器错误。这是我从C++常见问题解答中学到的。

//Foo.cpp
template class Foo<Cup>;
template class Foo<Chalice>;
template class Foo<SippyCup>;
// ...etc.

事实上,我有大约20多个子类,我想在代码的任何时候使用它们。在开发过程中,我不断地创建新的子类。所以每次我创建一个新的,我都必须将它添加到Foo.cpp中的这个不断增长的列表中。

这很痛苦。有没有办法避免列出所有这些可能性?

避免这种情况的方法是将模板函数定义放在头文件中(即实际的模板定义中),而不是放在单独的.cpp文件中。

没有任何模板专门化的Foo类定义需要存在于.h文件(或像上面链接中所说的.tpp文件)中。但是,模板专用类定义需要在.cpp文件中定义,并在.h文件(或.tpp文件)中使用该类型的前向声明。例如,你想为Cup和有一个不同的模板类定义

// Foo.h
template <class T>
class Foo
{
  T bar;
};
template<> class Foo<Cup>;

然后,您可以在同一个或不同的头文件中对模板类的这种特殊形式进行不同的声明。类的模板化(非特殊化表示)的所有模板成员函数和构造函数都应该在.h文件(或.tpp文件)中,但Cup专用模板类的构造函数必须在.cpp文件中,以避免链接器错误。此外,非专门化和专门化模板类的所有非模板化成员函数都必须在.cpp文件中定义,如果它们不是内联的:)。希望这能有所帮助!!!!