【发布时间】:2018-06-09 14:52:29
【问题描述】:
我对@987654321@ 有一些经验。 IIRC,它是关于如果一个格式良好的表达式导致 true 返回用户类型 T(如果给定)或通过嵌套类型别名返回 void。
template<bool,typename = void>
struct enable_if;
template<typename T>
struct enable_if<true,T>{
using type = T;
};
template <typename T, typename = void>
struct base_template{
enum { value= false};
};
template <typename T>
struct base_template<T, typename enable_if<std::is_integral<T>::value>::type> {
enum { value= true};// something useful...
};
struct some{};
static_assert(base_template<some>::value,"F*"); //error: static assertion failed: F
static_assert(base_template<int>::value,"F*");
但是在 boost.Hana 中我看到了这个特性 when 并且它的实现就像
template <bool condition>
struct when;
template <typename T, typename = when<true>>
struct base_template{
enum { value= false};
};
template <typename T>
struct base_template<T, when<std::is_integral<T>::value>> {
enum { value= true};// something useful...
};
struct some{};
static_assert(base_template<int>::value,"F*");
static_assert(base_template<some>::value,"F*");<source>:28:15: error: static assertion failed: F*
SFINAE 如何在这里工作?尽管std::is_integral<some>::value 会导致错误,但这并不意味着(它会?)when<false> 是ill-formed 并且应该将实例化分配给主类模板。我在这里有什么遗漏吗?
【问题讨论】:
-
@ildjarn 当然它们并不相同,因为
enable_if_t是一个类型别名,而when是一个类模板,不像enable_if_t我看不到when拉任何嵌套类型关闭。
标签: c++ c++14 boost-hana