派生类模板指定基类参数后,如何简化复用基类using声明?
更简便的基类类型别名复用方案
当然有更简洁的方式!你现在重复写using myfl_t = typename base_t::myfl_t;完全没必要,C++提供了直接引入基类成员的语法,能帮你省去这一步。
方案1:直接导入基类的类型别名
你只需要在派生类中用using base_t::myfl_t;就能把基类的myfl_t别名直接导入到派生类的作用域中,无需重新定义。修改后的代码如下:
#include <iostream> template<typename T, typename T2> class a { public: using myfl_t = float; a(myfl_t fl, double db) {} virtual void f() { std::cout << "a::f()\n"; } }; template<typename T> class b : public a<T, int> { using base_t = a<T, int>; using base_t::myfl_t; // 直接导入基类的类型别名,无需重复定义 public: b(myfl_t fl, double db) : base_t(fl, db) {} void f() override { std::cout << "b::f()\n"; } }; int main() { b<int> obj(3.14f, 2.718); obj.f(); // 输出 b::f() // 验证类型别名可用 b<int>::myfl_t val = 1.5f; std::cout << val << std::endl; // 输出 1.5 return 0; }
方案2:直接引用基类模板的别名(省略base_t)
如果你不想定义base_t,也可以直接写using a<T, int>::myfl_t;,不过用base_t能让代码更易维护——后续如果基类模板的参数需要修改,只改一处base_t的定义即可:
template<typename T> class b : public a<T, int> { using a<T, int>::myfl_t; // 直接导入基类模板的类型别名 public: b(myfl_t fl, double db) : a<T, int>(fl, db) {} void f() override { std::cout << "b::f()\n"; } };
注意事项
- 基类的
myfl_t必须是protected或public的,派生类才能访问并导入。你示例中的myfl_t是public的,完全符合要求。 - 这种方式不仅适用于类型别名,还能导入基类的成员函数、枚举等其他成员,是C++中复用基类成员的常用技巧。
内容的提问来源于stack exchange,提问作者Bogdan
相关产品推荐
相关产品推荐

