如何使模板函数头更短

时间:2012-12-04 21:56:28

标签: c++ templates

我有一个模板类,我们称之为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>

然后使上面的函数头更简单(更短)?

谢谢!

2 个答案:

答案 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;

所有这一切,有很多模板参数我强烈建议仔细检查和三重检查你的设计。 所有参数真的必须彼此独立地变化吗?如果是这样,你最终可能会成百上千的实例。