草庐IT

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将从重载集中剔除函数,以便选择另一个函数(如果

c++ - 模板替换和 SFINAE 中的私有(private)成员访问

classA{inta;};templateclasstest{};templateclasstest{};intmain(){testa;}上面的代码在clangversion3.8.0-2ubuntu4(tags/RELEASE_380/final)上编译没有错误,但无法在g++-5(Ubuntu5.4.1-2ubuntu1~16.04)5.4.120160904上编译和g++-6(Ubuntu6.2.0-3ubuntu11~16.04)6.2.020160901有这样的错误:main.cpp:Infunction‘intmain()’:main.cpp:9:22:error:‘i

c++ - 模板替换和 SFINAE 中的私有(private)成员访问

classA{inta;};templateclasstest{};templateclasstest{};intmain(){testa;}上面的代码在clangversion3.8.0-2ubuntu4(tags/RELEASE_380/final)上编译没有错误,但无法在g++-5(Ubuntu5.4.1-2ubuntu1~16.04)5.4.120160904上编译和g++-6(Ubuntu6.2.0-3ubuntu11~16.04)6.2.020160901有这样的错误:main.cpp:Infunction‘intmain()’:main.cpp:9:22:error:‘i

c++ - GCC 和 clang (SFINAE) 之间的重载解析行为差异

GCC接受以下代码:templatestructmeta{typedeftypenameT::typetype;};structS{};templatetypenamemeta::typefoo(T,S);intfoo(int,int);intmain(){foo(0,0);}但是clang拒绝它并出现以下错误:test.cpp:4:22:error:type'int'cannotbeusedpriorto'::'becauseithasnomemberstypedeftypenameT::typetype;^test.cpp:10:10:note:ininstantiationoft

c++ - GCC 和 clang (SFINAE) 之间的重载解析行为差异

GCC接受以下代码:templatestructmeta{typedeftypenameT::typetype;};structS{};templatetypenamemeta::typefoo(T,S);intfoo(int,int);intmain(){foo(0,0);}但是clang拒绝它并出现以下错误:test.cpp:4:22:error:type'int'cannotbeusedpriorto'::'becauseithasnomemberstypedeftypenameT::typetype;^test.cpp:10:10:note:ininstantiationoft

c++ - 检查类型是否可散列

我想创建一个类型特征,以使用标准库的无序容器的默认实例化检查特定类型是否可散列,因此它是否具有std::hash的有效特化.我认为这将是一个非常有用的功能(例如,在通用代码中使用std::set作为std::unordered_set的故障保护)。所以我想std::hash没有为每种类型定义,开始制作以下SFINAE解决方案:templatestd::true_typehashable_helper(constT&,consttypenamestd::hash::argument_type*=nullptr);templatestd::false_typehashable_helper

c++ - 检查类型是否可散列

我想创建一个类型特征,以使用标准库的无序容器的默认实例化检查特定类型是否可散列,因此它是否具有std::hash的有效特化.我认为这将是一个非常有用的功能(例如,在通用代码中使用std::set作为std::unordered_set的故障保护)。所以我想std::hash没有为每种类型定义,开始制作以下SFINAE解决方案:templatestd::true_typehashable_helper(constT&,consttypenamestd::hash::argument_type*=nullptr);templatestd::false_typehashable_helper

c++ - SFINAE 和 decltype(自动)

如果函数模板返回decltype(auto)(或另一个使用auto的类型说明符)但返回语句格式不正确,SFINAE会导致结果吗?return语句是否被认为是函数签名的直接上下文?N3690草案中似乎没有任何要求。默认情况下,我猜SFINAE不适用。这似乎很不幸,因为您可以编写一个函数来转发到另一个函数,但是您不能像以手写方式编写时那样使其存在以委托(delegate)为条件。此外,如果没有decltype(auto),则无法检查对等非静态成员函数的存在,因为this不能在函数签名中使用。然而,这表明存在一个基本问题,因为decltype(auto)提供了一条路径,可以在成员签名中将类类

c++ - SFINAE 和 decltype(自动)

如果函数模板返回decltype(auto)(或另一个使用auto的类型说明符)但返回语句格式不正确,SFINAE会导致结果吗?return语句是否被认为是函数签名的直接上下文?N3690草案中似乎没有任何要求。默认情况下,我猜SFINAE不适用。这似乎很不幸,因为您可以编写一个函数来转发到另一个函数,但是您不能像以手写方式编写时那样使其存在以委托(delegate)为条件。此外,如果没有decltype(auto),则无法检查对等非静态成员函数的存在,因为this不能在函数签名中使用。然而,这表明存在一个基本问题,因为decltype(auto)提供了一条路径,可以在成员签名中将类类

c++ - 带有 std::ostream 的 declval 表达式(用于 SFINAE)

我正在尝试创建一个类型特征类来确定特定类型T可以通过进行流式传输std::ostream的运算符.我使用的是简单的SFINAE技术。最终,我尝试评估替换失败的表达式是:decltype(std::declval()());我的期望是,给定一个实例t类型T和std::ostream实例os,如果表达式os格式不正确,则应发生替换失败。但无论类型如何T显然都不会出现替换失败。.即使我只是声明typedef使用上述decltype表达式,在SFINAE的上下文之外,它可以愉快地编译,即使T不能与std::ostream一起使用.例如:structFoo{};intmain(){//Thisc