如何声明类模板所有特化共有的成员且无需指定特化即可访问
实现方案
原来的写法Foo::id_type无法通过编译的原因是,Foo本身是类模板,不是完整的类型,必须传入模板参数实例化后才能访问内部的成员类型。要实现无需指定模板特化即可访问类模板公共成员的需求,最通用无开销的做法是将所有特化共享、不依赖模板参数的内容抽取到独立的非模板基类中:
// 公共基类:存放所有不依赖模板参数的共享内容 struct FooBase { using id_type = unsigned int; // 还可新增其他共享类型别名、静态变量、成员函数等 }; // 原类模板公开继承公共基类 template <typename T> struct Foo : public FooBase { // 此处仅保留依赖模板参数T的实现 T data; void process(const T& input) { /* 业务逻辑 */ } };
使用方式如下:
// 无需指定任何模板参数即可直接访问共享类型 FooBase::id_type theId = 2048; // 原有类模板的使用习惯完全兼容,任意特化访问到的id_type都是同一类型 Foo<int>::id_type id1 = 1024; Foo<std::string>::id_type id2 = 512;
如果不想额外引入基类,也可以给类模板设置默认参数:
template <typename T = void> struct Foo { using id_type = unsigned int; T data; }; // 通过默认参数的特化访问,无需手动传参 Foo<>::id_type theId = 1024;
该方案仅适合没有偏特化的简单场景,语义清晰度和兼容性不如基类方案。
内容的提问来源于stack exchange,提问作者jpo234
相关产品推荐
相关产品推荐

