Stringify和Unstringify模板参数

kam*_*iro 1 c++ templates

假设我在命名时有很多带有"*Pack"对应类的类.例如,如果我有一个Moo类,我有MooPack,如果我有Foo,我也有FooPack.

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

template <class X, class XPack>
XPack packify(X input){
   ...
}
Run Code Online (Sandbox Code Playgroud)

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

Moo moo;
MooPack mooppey = packify<Moo, MooPack>(moo);
Run Code Online (Sandbox Code Playgroud)

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

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

Pup*_*ppy 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);
Run Code Online (Sandbox Code Playgroud)

  • 你甚至不需要嵌套`*Pack`类,你只需要为它提供一个嵌套的typedef.用法与上例相同.这是一种非常常见的模式(称为"元函数"). (2认同)