草庐IT

c++ - 使用 decltype/SFINAE 检测运算符(operator)支持

一个(有点)过时的article探索使用方法decltype与SFINAE一起检测类型是否支持某些运算符,例如==或.这是检测类是否支持的示例代码运营商:templatestructsupports_less_than{staticautoless_than_test(constT*t)->decltype(*tless_than_test(...){}staticconstboolvalue=(sizeof(less_than_test((T*)0))==1);};intmain(){std::cout::value这会输出true,因为当然std::string支持运算符(oper

c++ - SFINAE 模板特化优先级

#include#include#includetemplatestructtrait;templatestructtrait().begin(),std::declval().end(),void())>{staticconstchar*name(){return"Container";}};templatestructtrait>{staticconstchar*name(){return"std::array";}};intmain(intargc,char*argv[]){std::cout>::name()>::name()我期待第三个模板比第二个更专业,但我得到了一个模棱两

c++ - SFINAE 模板特化优先级

#include#include#includetemplatestructtrait;templatestructtrait().begin(),std::declval().end(),void())>{staticconstchar*name(){return"Container";}};templatestructtrait>{staticconstchar*name(){return"std::array";}};intmain(intargc,char*argv[]){std::cout>::name()>::name()我期待第三个模板比第二个更专业,但我得到了一个模棱两

c++ - 模板重载和 SFINAE 仅适用于函数而不适用于类

谁能解释一下为什么编译器只接受这段代码template::type=0>voida_function(){}template::type=0>voida_function(){}但不是这个:template::type=0>classa_class{};template::type=0>classa_class{};编译器将第二个类模板视为对第一个类模板的重新定义。 最佳答案 您必须对类(class)使用特化。通常,它是通过一个额外的参数来完成的:templateclassT;templateclassT::type>{therea

c++ - 模板重载和 SFINAE 仅适用于函数而不适用于类

谁能解释一下为什么编译器只接受这段代码template::type=0>voida_function(){}template::type=0>voida_function(){}但不是这个:template::type=0>classa_class{};template::type=0>classa_class{};编译器将第二个类模板视为对第一个类模板的重新定义。 最佳答案 您必须对类(class)使用特化。通常,它是通过一个额外的参数来完成的:templateclassT;templateclassT::type>{therea

c++ - 为什么在没有参数的情况下调用省略号而不是可变参数模板?

我正在使用以下SFINAE模式来评估可变参数类型列表上的谓词:#includevoidf(int=0);//forexampletemplate()...))>std::true_typecheck(T&&...);std::false_typecheck(...);templateusingPredicate=decltype(check(std::declval()...));static_assert(!Predicate::value,"!!");static_assert(Predicate::value,"!!");static_assert(Predicate::valu

c++ - 为什么在没有参数的情况下调用省略号而不是可变参数模板?

我正在使用以下SFINAE模式来评估可变参数类型列表上的谓词:#includevoidf(int=0);//forexampletemplate()...))>std::true_typecheck(T&&...);std::false_typecheck(...);templateusingPredicate=decltype(check(std::declval()...));static_assert(!Predicate::value,"!!");static_assert(Predicate::value,"!!");static_assert(Predicate::valu

c++ - 如果不允许 constexpr,为什么 sfinae on?

检测成语的工作原理如下templatestructhas_foo{staticconstexprboolvalue=false;};templatestructhas_foo>{staticconstexprboolvalue=true;};templateconstexprboolhas_foo_v=has_foo::value;然后我们可以检测到任何类型T中是否存在foo。ifconstexpr(has_foo_v)var.foo();我的问题是,要输入的内容很多(阅读:想敲很多键盘才能输入),我想知道以下是否可行ifconstexpr(std::void_t(),true)var

c++ - 如果不允许 constexpr,为什么 sfinae on?

检测成语的工作原理如下templatestructhas_foo{staticconstexprboolvalue=false;};templatestructhas_foo>{staticconstexprboolvalue=true;};templateconstexprboolhas_foo_v=has_foo::value;然后我们可以检测到任何类型T中是否存在foo。ifconstexpr(has_foo_v)var.foo();我的问题是,要输入的内容很多(阅读:想敲很多键盘才能输入),我想知道以下是否可行ifconstexpr(std::void_t(),true)var

c++ - SFINAE:static_assert 与 std::enable_if

以下(建议!)语法有什么缺点吗?templatevoidf()static_assert(std::is_same::value){;}而不是SFINAE(看起来像拐杖):template::value>::type>voidf(){;}甚至更糟:templatetypenamestd::enable_if::value>::typef(){;}其中禁止使用auto推导结果类型。 最佳答案 首先,它们是不同的,特别是它们不是同时检查的。关键的区别在于它们在重载解析方面的应用。SFINAE将从重载集中剔除函数,以便选择另一个函数(如果