假设我在命名时有很多带有"*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?
你不必指定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);