草庐IT

c++ - SFINAE 适用于扣除但因替代而失败

考虑以下MCVEstructA{};templatevoidtest(T,T){}templateclassWrapper{usingtype=typenameT::type;};templatevoidtest(Wrapper,Wrapper){}intmain(){Aa,b;test(a,b);//workstest(a,b);//doesn'tworkreturn0;}这里test(a,b);作品和test(a,b);失败::11:30:error:notypenamed'type'in'A'usingtype=typenameT::type;~~~~~~~~~~~~^~~~:2

c++ - 使用 void_t 的多个 SFINAE 类模板特化

当每个类模板特化仅在涉及非推导上下文中的模板参数的模式之间是不同的时,多个类模板特化是否有效?std::void_t的一个常见示例使用它来定义一个特征,该特征揭示一个类型是否有一个名为“type”的成员typedef。在这里,采用了单一的特化。这可以扩展来识别一个类型是否有或者一个名为“type1”的成员typedef,或者一个名为“type2”的成员。下面的C++1z代码使用GCC编译,但不是Clang。合法吗?template>structhas_members:std::false_type{};templatestructhas_members>:std::true_type{

c++ - 使用 void_t 的多个 SFINAE 类模板特化

当每个类模板特化仅在涉及非推导上下文中的模板参数的模式之间是不同的时,多个类模板特化是否有效?std::void_t的一个常见示例使用它来定义一个特征,该特征揭示一个类型是否有一个名为“type”的成员typedef。在这里,采用了单一的特化。这可以扩展来识别一个类型是否有或者一个名为“type1”的成员typedef,或者一个名为“type2”的成员。下面的C++1z代码使用GCC编译,但不是Clang。合法吗?template>structhas_members:std::false_type{};templatestructhas_members>:std::true_type{

c++ - 'if' 带有模板参数或 SFINAE 是首选?

首选是这样的:templateboolisNotZero(constT&a){if(std::is_floating_point::value)returnabs(a)>std::numeric_limits::epsilon();elsereturna;}或者这个:?templatestd::enable_if::value,bool>::typeisNotZero(constT&a){returnabs(a)>std::numeric_limits::epsilon();}templatestd::enable_if::value,bool>::typeisNotZero(cons

c++ - 'if' 带有模板参数或 SFINAE 是首选?

首选是这样的:templateboolisNotZero(constT&a){if(std::is_floating_point::value)returnabs(a)>std::numeric_limits::epsilon();elsereturna;}或者这个:?templatestd::enable_if::value,bool>::typeisNotZero(constT&a){returnabs(a)>std::numeric_limits::epsilon();}templatestd::enable_if::value,bool>::typeisNotZero(cons

c++ - 有人说某事对 SFINAE 友好是什么意思?

当有人提到某个特定函数、结构或...SFINAE友好时,我无法清楚地理解它的含义。谁能解释一下? 最佳答案 当它允许替换失败而没有硬错误时(如static_assert)。例如templatevoidcall_f(constT&t){t.f();}为所有T声明函数,甚至那些没有f的,所以你不能在call_f上做SFINAE因为该方法确实存在。(Demo的非编译代码)。有以下变化:templateautocall_f(constT&t)->decltype(t.f(),void()){t.f();}该方法仅适用于有效的T。所以你可以将

c++ - 有人说某事对 SFINAE 友好是什么意思?

当有人提到某个特定函数、结构或...SFINAE友好时,我无法清楚地理解它的含义。谁能解释一下? 最佳答案 当它允许替换失败而没有硬错误时(如static_assert)。例如templatevoidcall_f(constT&t){t.f();}为所有T声明函数,甚至那些没有f的,所以你不能在call_f上做SFINAE因为该方法确实存在。(Demo的非编译代码)。有以下变化:templateautocall_f(constT&t)->decltype(t.f(),void()){t.f();}该方法仅适用于有效的T。所以你可以将

c++ - 何时使用 `static_assert` 而不是 SFINAE?

我一直在使用(并且看到使用)static_assert来标记模板参数值的不想要的值。但是,对于我遇到的所有情况,通过SFINAE禁用那些不需要的值似乎更好、更优雅。例如:template::value>::type>structFoo{...};代替:templatestructFoo{static_assert(std::is_floating_point::value,"Foo:Tmustbefloatingpoint:-(");...};所以我的问题是:我什么时候应该使用static_assert而不是SFINAE,为什么?编辑:我认为到目前为止我学到的内容如下:1.SFINAE

c++ - 何时使用 `static_assert` 而不是 SFINAE?

我一直在使用(并且看到使用)static_assert来标记模板参数值的不想要的值。但是,对于我遇到的所有情况,通过SFINAE禁用那些不需要的值似乎更好、更优雅。例如:template::value>::type>structFoo{...};代替:templatestructFoo{static_assert(std::is_floating_point::value,"Foo:Tmustbefloatingpoint:-(");...};所以我的问题是:我什么时候应该使用static_assert而不是SFINAE,为什么?编辑:我认为到目前为止我学到的内容如下:1.SFINAE

c++ - 使用 SFINAE 检查类型是否完整

这个问题在这里已经有了答案:Howtowrite`is_complete`template?(9个回答)关闭8年前。是否可以通过SFINAE检查类型是否已完全定义?例如templatestructhash;templatestructhash{};//is_defined_hash_typedefinition...enumEnum{A,B,C,D};static_assert(is_defined_hash_type::value,"hashshouldbedefined");static_assert(!is_defined_hash_type::value,"hashshould