第一个问题是,你的类模板真的需要那么多参数吗?如果是这样,它们可以以某种方式打包吗?
其次,如果定义所有函数的样板文件超出了实际代码的范围,为什么不在类定义中内联定义它们呢?是的,有些人认为这种风格通常很糟糕,但这是一种权衡——该指南的目标是使您的代码更具可读性,如果它产生相反的效果,请忽略它。
即使您想将实现保留在一个单独.ipp
的文件中,该文件包含在.hpp
文件末尾以便更好地组织代码,您也可以将其更改为.ipp
在中间包含:
foo.hpp:
template <class a, class b ... class x>
class foo {
#include "foo_impl.ipp"
};
foo_impl.ipp:
void function1() {}
void function2() {}
如果这些想法都不吸引您,那么 typedef 或模板别名将无济于事,因为这是为模板的特化命名。无论您做什么,任何仍然免费的模板参数仍然必须列出,否则编译器将不知道您在说什么。
但是你总是可以使用预处理器:
#define FOOMETHOD(rettype) template<class a, class b ... class x> \
rettype foo<a, b, ..., x>
FOOMETHOD(void)::function1() { }
FOOMETHOD(void)::function2() { }
有很多方法可以修改它——把 放入::
宏中,把它分成两个宏,这样你就不需要传入 rettype,为每种类型定义一个不同的宏,等等。任何看起来最适合你的使用案例,这样做。