c++ - 在类中使用成员类模板特化
问题描述
是否有在同一个类中使用成员类模板专业化的标准兼容方式?
struct S {
template<typename T> struct Data;
// Explicit (AKA full) template specialization is not allowed here.
template<> struct Data<char> {};
template<> struct Data<int> {};
Data<char> d1;
Data<int> d2;
};
不起作用,因为在类中不允许成员类模板的完全特化。在这种情况下,一些编译器选择忽略神圣标准并对该代码感到满意,但有些编译器正在遵守规则。
struct S {
template<typename T> struct Data;
// Specializations are not defined at this point.
Data<char> d1;
Data<int> d2;
};
template<> struct S::Data<char> {};
template<> struct S::Data<int> {};
也不起作用,因为在定义之前不能使用特化。
我知道我可以将成员类模板移出类,但这不是重点。
愚蠢的是,如果我出于这个原因使用额外的模板参数,我可以绕过对类内模板专业化的禁止:
struct S {
template<typename T, typename NotUsed = void> struct Data;
// Now it's a partial template specialization, which is allowed.
template<typename NotUsed> struct Data<char, NotUsed> {};
template<typename NotUsed> struct Data<int, NotUsed> {};
Data<char> d1;
Data<int> d2;
};
现在很好,因为类中允许部分模板特化。
我是否错过了某种“正确方式”的做法——在课堂外进行专业化并且仍然能够在里面使用它?我假设标准的 C++17 版本。
解决方案
推荐阅读
- imagemagick - GraphicsMagick .toBuffer() 创建空缓冲区流
- ios - iOS 集合视图装饰视图:补充视图的子类
- laravel - 在 Laravel 中对 Google Document AI 的 v1 API 进行身份验证
- php - WooCommerce:获取单个产品的价格和描述
- reactjs - 如何在 Azure 上的不同 URL 中为每个 PR 部署 React App?
- javascript - 如何使用 typeof 运算符检查函数是否为字符串
- pytorch - 是否可以在 brython 脚本中运行 PyTorch?
- ansible - 基于先前命令输出的 Ansible win_shell 循环
- angular - 用于 Msal 和 B2C 的 Angular Azure 登录切换键
- javascript - 如何在不使用 Moment.js 持续时间功能的情况下处理持续时间?