【发布时间】:2020-05-03 07:44:41
【问题描述】:
我正在尝试使用默认参数来理解部分模板专业化。如果我在 is_comparable 专业化中删除强制转换为 void,则打印的值始终为 false,而如果我保持强制转换为 (void),则一切正常。有人可以解释为什么需要演员表作废吗?它可能与匹配 T3 的默认模板参数有关,但我试图在这里对模板部分专业化和默认模板参数的注意事项进行一些额外的了解。
template<typename T1, typename T2, typename T3 = void>
struct is_comparable
{
static const bool value = false;
};
template<typename T1, typename T2>
struct is_comparable<T1, T2, decltype((void)(std::declval<T1>() == std::declval<T2>()))>
{
static const bool value = true;
};
int main()
{
cout << boolalpha;
cout << is_comparable<int, char>::value << endl;
cout << is_comparable<int, float *>::value << endl;
}
更新:即使使用指针,我也观察到相同的行为。我会假设在这种情况下会选择部分专业化?
template<typename T1, typename T2, typename T3 = void>
struct is_comparable
{
static const bool value = false;
};
template<typename T1, typename T2>
struct is_comparable<T1*, T2*, decltype((std::declval<T1>() == std::declval<T2>()))>
{
static const bool value = true;
};
int main()
{
cout << boolalpha;
cout << is_comparable<int*, int*>::value << endl;
}
【问题讨论】:
标签: c++ templates decltype enable-if