假设我在命名时有很多类与“* 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?
答案 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);
通过这种方式,您无需手动指定模板参数即可调用该函数,而无需自行修改类。