c++ - 模板类特化 enable_if 和默认值
问题描述
鉴于以下
template <typename T, typename Enable=void>
struct test{};
template <typename T,
typename std::enable_if< some_trait<T>::value >::type >
struct test{};
假设some_trait<T>::value
is true
, enable_if<T>::type
is void
,并且选择了专业化。但是,当出现以下情况时,我的查询与选择有关。
template <typename T,
typename std::enable_if_t< some_trait<T>::value,T>::type >
struct test{};
当为enable_if
提供第二个非 void 模板参数::type
时,将选择非特化模板,即使some_trait<T>::value
is true
、 as ::type
isT
而不是void
,因此与主模板中的默认值不匹配。
我的问题是在标准中描述了选择哪个模板的顺序,以及为什么实例化test<T,void>
被认为是更好的匹配test<T,T>
。
完整样本:
#include <iostream>
#include <type_traits>
template <typename T,typename Enable=void>
struct test
{
const char* value = "Primary";
};
#if 1// toggle this
template <typename T>
struct test<T,typename std::enable_if< std::is_same<T,T>::value >::type >
{
const char* value = "Specialization";
};
#else
template <typename T>
struct test<T,typename std::enable_if< std::is_same<T,T>::value,T >::type>
{ /// ^
const char* value = "Specialization";
};
#endif
int main() {
test<int> v;
std::cout << v.value << std::endl;
return 0;
}
解决方案
在第一种情况下,您有类型
std::enable_if< true, void >
在第二种情况下,您有类型
std::enable_if< true, int >
std::enable_if< true, int >::type
是int
。它不符合 a 作为类型的要求typename Enable
,它被要求为void
推荐阅读
- java - Android Instrumentation 测试:没有仪器注册错误
- r - 如何将字符串拆分为其字符向量?
- python - 从熊猫数据框中绘制时间序列:根据日期拆分
- android - Picasso 仅从缓存中加载 6 张图片
- angular - angular .net core api cors 预检请求错误
- hibernate-mapping - 如何将与列相同的命名策略应用于@Index columnList?
- shell - 什么是获取当前日期和日期 3 小时的 shell 命令?
- python - 使用列中的数据创建新列
- python - Python - 用字母等级替换CSV文件中的整数
- c# - 长路径 \\?\ 解决方法不适用于某些安装