C++模板元编程:模板模板参数继承的语法优化需求
简化C++14中Buffer类的继承与特化写法
首先,我完全get到你的核心痛点:
- 原继承写法
class Buffer : storage_t<Buffer<storage_t,void,void>, T2, is_allocated>太啰嗦,希望简化成storage_t<Buffer, T2, is_allocated> - 想让
mutable_storage直接针对Buffer模板做特化,而非依赖Buffer的某个具体实例化类型
调整后的可编译方案
我们可以通过把storage_t的第一个参数从类型参数改成模板模板参数,完美实现你想要的简洁写法:
#include <type_traits> // 重定义mutable_storage,第一个参数改为模板模板参数,用于接收Buffer模板 template <template <template<class, class, class> class, class, class> class BufferT, typename T2, typename is_allocated> struct mutable_storage {}; // 按你期望的方式特化mutable_storage,直接针对Buffer模板 template <typename T2, typename is_allocated> struct mutable_storage<Buffer, T2, is_allocated> { // 在这里添加特化后的逻辑,比如成员变量或方法 void demo_func() {} }; // Buffer类的继承写法简化为直接传递Buffer模板本身 template <template <template<class, class, class> class, class, class> class storage_t, typename T2 = void, typename is_allocated = std::false_type> class Buffer : storage_t<Buffer, T2, is_allocated> {}; int main() { typedef Buffer<mutable_storage> example_buffer; example_buffer buf; buf.demo_func(); // 可以调用特化后的方法 }
关键改动说明
模板模板参数的妙用:
- 把
mutable_storage的第一个参数从typename T1(只能接收具体类型)改成模板模板参数,这样它就能直接接收Buffer这个模板本身,不用再传Buffer<storage_t,void,void>这种实例化后的具体类型。 - 对应的
Buffer类模板参数也做了匹配调整,确保继承时传递的Buffer模板能被storage_t正确识别。
- 把
简洁的特化实现:
- 现在你可以完全按照期望的写法特化
mutable_storage:template <typename T2, typename is_allocated> struct mutable_storage<Buffer, T2, is_allocated>,彻底摆脱了之前依赖具体类型的繁琐写法。
- 现在你可以完全按照期望的写法特化
C++14兼容性:
- 模板模板参数是C++14完全支持的特性,这个方案不需要依赖更高版本的标准,符合你指定的编译环境要求。
其他需要注意的细节
- 模板签名匹配:确保
storage_t的模板模板参数和Buffer的模板参数签名完全一致(包括参数数量、默认值等),否则会出现编译不匹配的错误。 - CRTP逻辑自洽性:当前
Buffer继承自storage_t<Buffer, ...>的设计是自洽的,不会出现循环依赖问题,这也是CRTP的标准用法。 - 默认参数一致性:
Buffer的T2和is_allocated默认参数要和storage_t的参数预期匹配,避免出现意外的实例化行为。
内容的提问来源于stack exchange,提问作者Lourens Dijkstra
相关产品推荐
相关产品推荐

