C++能否在基类中获取子类类型,实现类似D语言返回子类实例的功能?
C++没有和你使用的D语言特性完全对等的原生语法,但可以通过**奇异递归模板模式(CRTP)**实现需求,不需要用到typeid——typeid是运行时类型信息,只能用来做运行时类型比对,无法作为类型标识符用于编译期的类型声明、模板实例化,完全满足不了你的需求。
实现代码
template <typename Derived, typename T> class A { public: T commonData; // Derived就是你要的TYPEOF_CHILD_CLASS,编译期确定类型 Derived *test(T data) { return new Derived(data); } }; template <typename T> // 继承时把当前派生类作为第一个模板参数传入基类 class B : public A<B<T>, T> { public: T bdata; B(T data) { bdata = data; } }; template <typename T> class C : public A<C<T>, T> { public: T cdata; C(T data) { cdata = data; } }; int main(int argc, char const *argv[]) { auto a = C<int>(1).test(2); // a的类型就是C<int>*,和你预期的功能完全一致 delete a; return 0; }
补充说明
CRTP是C++常用的编译期多态技术,所有逻辑都在编译期完成,没有运行时开销,和你在D语言中用模板实现的效果完全等价。
内容的提问来源于stack exchange,提问作者Wusiki Jeronii
相关产品推荐
相关产品推荐

