可变参数类的多重继承实现咨询:能否编写如下C++模板代码?
问题解答
你提供的这段C++模板代码是完全合法的,并且正好实现了你期望的行为。
代码解析
template<class... Ds>是可变参数模板(C++11引入),其中Ds是一个模板参数包,它可以接受任意数量(包括0个)的类型参数。public A<Ds>...是包展开语法,编译器会自动把参数包Ds中的每个类型逐一展开,最终生成多个基类的继承声明。比如当你实例化B<D1, D2>时,编译器会将其展开为:class B : public A<D1>, public A<D2> {};
和你手动编写的代码完全等价。
实例化示例
比如你可以这样使用这个模板:
// 等价于继承A<int>和A<std::string> B<int, std::string> b;
额外注意
如果需要限制B必须至少传入一个模板参数,可以通过静态断言或C++20的约束来实现:
template<class... Ds> class B : public A<Ds>... { static_assert(sizeof...(Ds) > 0, "B requires at least one template parameter"); };
内容的提问来源于stack exchange,提问作者SpeakX
相关产品推荐
相关产品推荐

