1

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

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

谢谢!

4

2 回答 2

2

第一个问题是,你的类模板真的需要那么多参数吗?如果是这样,它们可以以某种方式打包吗?

其次,如果定义所有函数的样板文件超出了实际代码的范围,为什么不在类定义中内联定义它们呢?是的,有些人认为这种风格通常很糟糕,但这是一种权衡——该指南的目标是使您的代码更具可读性,如果它产生相反的效果,请忽略它。

即使您想将实现保留在一个单独.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,为每种类型定义一个不同的宏,等等。任何看起来最适合你的使用案例,这样做。

于 2012-12-04T22:02:52.813 回答
0

在 C++ 中,您有点卡在这里,因为您的问题没有直接的解决方案。您可以内联定义函数以避免键入参数,或者将所有类型打包到策略类中:

struct Policy1
{
    typedef int B;
    typedef double B;
    typedef Foo C;
};

template<class Policies>
void foo<Policies>::function1() { }

foo<Policy1> FooObject;

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

于 2012-12-04T22:26:04.557 回答