如何缩短模板函数头

how to make template function header shorter

本文关键字:函数 何缩短      更新时间:2023-10-16

我有一个模板类,我们称它为foo。在实施中,我有:

template<class a, class b ... class x>
void foo<a, b, ..., x>::function1() { }
template<class a, class b ... class x>
void foo<a, b, ..., x>::function2() { }

现在我想让它读起来更简单。我能做一些类似typedef的事情吗定义

template<class a, class b... class x> foo<a, b, ..., x>

那么让上面的函数头更简单(更短)?

THanks!

第一个问题是,您的类模板真的需要那么多参数吗?如果是的话,他们能以某种方式打包吗?

其次,如果定义所有函数的样板文件超出了实际代码的范围,为什么不在类定义中内联定义它们呢?是的,有些人认为这种风格通常不好,但这是一种权衡——该准则的目标是让代码更可读,如果它有相反的效果,就忽略它

即使您想将实现保留在一个单独的.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,为每种类型定义一个不同的宏,等等。无论什么对你的用例来说最合理,都可以这样做。

在C++中,由于没有直接的解决方案,您有点陷入困境。您可以内联定义函数以避免键入参数,也可以将所有类型打包到一个策略类中:

struct Policy1
{
typedef int B;
typedef double B;
typedef Foo C;
};
template<class Policies>
void foo<Policies>::function1() { }
foo<Policy1> FooObject;

话虽如此,对于许多模板参数,我强烈建议对您的设计进行双重检查和三重检查。所有参数真的必须彼此独立地变化吗?如果是这样的话,你可能会得到成百上千个类的实例化。