我有一个模板类,我们称之为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>
然后使上面的函数头更简单(更短)?
谢谢!
答案 0 :(得分:2)
第一个问题是,你的类模板真的需要那么多参数吗?如果是这样,他们可以用某种方式打包吗?
其次,如果定义所有外联函数的样板是压倒实际代码,为什么不在类定义中内联定义它们呢?是的,有些人认为通常是糟糕的风格,但这是一种权衡 - 该指南的目标是使您的代码更具可读性,如果它具有相反的效果,则忽略它。
即使您希望将实现保留在单独的.ipp
文件中,该文件也包含在.hpp
文件的末尾,以便更好地进行代码组织,您可以将其更改为包括{{1}在中间:
foo.hpp:
.ipp
foo_impl.ipp:
template <class a, class b ... class x>
class foo {
#include "foo_impl.ipp"
};
如果这些想法都没有吸引你,那么typedef或模板别名就无法提供帮助,因为这是为了给模板的特化提供名称。无论你做什么,任何仍然免费的模板参数仍然必须列出,或者编译器不会知道你在说什么。
但是你总是可以使用预处理器:
void function1() {}
void function2() {}
有很多方法可以修改它 - 将#define FOOMETHOD(rettype) template<class a, class b ... class x> \
rettype foo<a, b, ..., x>
FOOMETHOD(void)::function1() { }
FOOMETHOD(void)::function2() { }
放在宏中,将其分成两个宏,这样就不需要传递rettype,为每种类型定义不同的宏,等等无论你的用例看起来最合理,都可以这样做。
答案 1 :(得分:0)
在C ++中,你有点被困在这里,因为你的问题没有直接的解决方案。您可以内联定义函数以避免键入参数,也可以将所有类型打包到策略类中:
struct Policy1
{
typedef int B;
typedef double B;
typedef Foo C;
};
template<class Policies>
void foo<Policies>::function1() { }
foo<Policy1> FooObject;
所有这一切,有很多模板参数我强烈建议仔细检查和三重检查你的设计。 所有参数真的必须彼此独立地变化吗?如果是这样,你最终可能会成百上千的实例。