如何缩短模板函数头
how to make template function header shorter
我有一个模板类,我们称它为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;
话虽如此,对于许多模板参数,我强烈建议对您的设计进行双重检查和三重检查。所有参数真的必须彼此独立地变化吗?如果是这样的话,你可能会得到成百上千个类的实例化。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- "virtual"对C++析构函数有何影响?
- 将 lambda 函数转换为另一个编译单元中的普通函数会缩短编译时间吗?
- C++ 友元函数在内存位置上有何不同?
- 缩短成员函数作用域说明符(嵌套类)(C++)
- 使用通用交换函数来缩短代码
- 指向成员函数的指针与指向数据成员的指针有何不同
- 双重列表复制构造函数:与单一列表复制构造函数有何不同
- 如何缩短模板函数头
- C++03 12.4/12对通过指针显式调用基类析构函数有何说明
- 缺少复制构造函数与对象切片有何关系
- 基例如何影响使用递归函数的哪些行
- 传递到函数中的char*被缩短为四个字符
- 缩短C++函数签名的标准方法