Stringify和Unstringify模板参数

时间:2011-01-07 13:08:21

标签: c++ templates

假设我在命名时有很多类与“* Pack”对应的类。例如,如果我有一个Moo类,我有MooPack,如果我有Foo,我也有FooPack。

我想要一个c ++模板化函数,它从Foo返回一个FooPack

template <class X, class XPack>
XPack packify(X input){
   ...
}

是否可以在不指定模板参数的情况下执行此操作?目前,这必须像下面这样做:

Moo moo;
MooPack mooppey = packify<Moo, MooPack>(moo);

如果它只需要Moo模板参数,那么丑陋的模板规范位可能会消失,但除了使用#defines之外,这还不是最好的解决方案,但仍然不能这样做。

有没有办法,还是我必须等待c ++ 0x?

2 个答案:

答案 0 :(得分:5)

你不必指定Moo,只需要指定MooPack,因为moo会为你推断出这个论点。但是,我建议您在Moo内部使MooPack成为typedef或嵌套类(称为Pack),在这种情况下,您可以通过模板中的typename X :: Pack轻松访问它。

class Moo {
public:
    class Pack {
        ...
    };
};
template<typename T> typename T::Pack packify(T t) {
    ...
}

// usage

Moo m;
Moo::Pack p = packify(m);

答案 1 :(得分:1)

正如DeadMG已经提到的答案,您不需要明确指定参数类型,因为它可以自动推断(如果它是第二个而不是第一个模板参数)。既然你说你不能改变类型声明来形成类之间的链接,我会建议它的特征路径(想想std :: iterator_traits):

template<typename T> struct pack_traits;
template<> struct pack_traits<Moo> { typedef MooPack Pack; };
...//traits for other packifable classes

template<typename T> pack_traits<T>::Pack packify(T val){...}
...
Moo moo;
MooPack mooppey = packify(moo);

通过这种方式,您无需手动指定模板参数即可调用该函数,而无需自行修改类。