C++03中能否用typedef实现类似C++11的模板参数固定功能?
能不能在C++03用typedef实现模板参数固定?
答案是不行——C03里的typedef并不支持模板化,你尝试写的template <class A> typedef C<A, int> D;这种语法是不合法的,这是C11才引入的模板别名特性(也就是你用using实现的那种用法)。
不过别担心,C++03里我们有替代方案可以实现类似的效果,主要有两种方式:
1. 嵌套typedef的模板结构体
用一个模板结构体来包裹我们想要的别名,通过内部的type成员来暴露固定参数后的模板实例:
template<class A, class B> class C{}; // 定义一个模板结构体,用来固定C的第二个参数为int template<class A> struct DAlias { typedef C<A, int> type; };
使用的时候,你需要通过::type来访问这个别名:
// 等价于C<double, int> DAlias<double>::type myObj;
这种方式完全是别名,不会创建新的类类型,和C++11的using效果最接近。
2. 模板继承
另一种方式是定义一个继承自目标模板实例的模板类:
template<class A, class B> class C{}; // D继承自C<A, int>,相当于固定了第二个参数 template<class A> class D : public C<A, int> {};
使用的时候直接用D<A>就可以:
// 等价于C<double, int>的子类实例 D<double> myObj;
不过要注意,这种方式是创建了一个新的类类型(C的子类),如果C有特殊的构造函数、或者你需要严格的类型等价性,这种方式可能会有潜在问题,比如基类和子类不是同一个类型,可能会影响一些模板推导或者类型判断。
总结一下:C03里没法用typedef直接做模板别名,但用嵌套typedef的结构体是最接近C11 using的替代方案。
内容的提问来源于stack exchange,提问作者Antares
相关产品推荐
相关产品推荐

