如何从模板父类导入模板成员类型且无需重复名称?
问题解答
在C++20之前的标准中,无法像导入非模板类型别名那样,不重复名称就从模板基类导入模板别名。你必须显式重复别名名称,就像你代码里可行的那行写法。
原因
C++语法规则里,针对模板别名的using声明,没有提供类似非模板类型的using typename Base::Type;这种简洁语法。模板别名的导入必须完整写出template<参数列表> using 别名 = 基类的模板别名<参数>;的形式,其中别名名称必须重复指定。
C++20的简化方案
C++20新增了模板using声明的简化语法,可以直接导入基类的模板别名而无需重复名称,写法如下:
template<typename T> using Target::Matrix;
修改后的完整可运行代码(需开启C++20编译选项):
#include <vector> struct CPU { using SimpleType = int; template<typename T> using Matrix = std::vector<std::vector<T>>; }; template<typename Target> struct Pipeline : public Target { using typename Target::SimpleType; // C++20 支持的简洁写法,无需重复Matrix名称 template<typename T> using Target::Matrix; void ff() { SimpleType x; Matrix<float> y; } }; int main() { Pipeline<CPU> pipeline; pipeline.ff(); }
旧标准兼容方案
如果你的项目仍在使用C++17或更早的标准,就只能采用你代码中那种重复名称的写法,没有更简洁的替代方案:
template<typename T> using Matrix = typename Target::template Matrix<T>;
内容的提问来源于stack exchange,提问作者rafoo
相关产品推荐
相关产品推荐

