c++ - C++11中基于类型要求的类模板成员函数
问题描述
给定一个类模板:
template<typename T>
class AAA
{
void XXX(T val) { /* code */ }
void YYY(T val) { /* code */ }
};
我知道我可以将成员函数 XXX 专门用于特定类型,例如“int”:
template<> void AAA<int>::XXX(int val) { /* code * }
但我真正想做的不是基于 T 的特定类型而是基于 T 的特定类型要求来专门化 XXX 函数,例如 T 应该是 copy_constructible。我知道 std::enable_if 是如何工作的,但无法提出正确的 C++ 语法来做我想做的事。请注意,我知道一种技术可以让我对类模板本身进行部分专门化,以使 T 可复制构造,但我不想这样做。
解决方案
你不能部分特化一个函数,但你可以部分特化整个类:
template<typename T, typename /* placeholder so there is a place for SFINAE */ = void>
class AAA
{
void XXX(T val) { /* code */ }
void YYY(T val) { /* code */ }
};
template<typename T>
class AAA<T, std::enable_if_t<std::is_copy_constructible_v<T>>>
{
void XXX(T val) { /* code when T is copy constructible */ }
void YYY(T val) { /* code when T is copy constructible */ }
};
推荐阅读
- android - 清理构建时如何防止删除构建目录?
- mysql - 如果每列都等于同一事物,则 MySQL 获取行
- google-chrome - Chrome 开发工具中的新调试图标“步骤 F9”
- crystal-reports - 如何比较水晶报表中的英尺/英寸值?
- html - 向下滚动时HTML / CSS中的静态菜单?
- scala - 在使用 getFromFile 提供文件时添加或更改要使用的媒体类型
- cucumber - 如何在黄瓜扩展报告中嵌入场景名称或功能名称作为报告文件名?
- scala - 如何使用Scala / spark数据框从第1行到第N行之间的一列计算值
- javascript - VB.Net 如何在 javascript 中下载 url?
- podio - 获取 Podio Activity / 所有修订 API