我假设decltype(auto)是一个不兼容的构造,当用于尝试和返回类型的SFINAE时.所以,如果你原本会遇到替换错误,那么你会遇到一个很难的错误 但为什么以下程序有效? https://wandbox.org/permlink/xyvxYsakTD1tM3yl #include <iostream> #include <type_traits> using std::cout; usin
我试图用sfinae检查进行朋友声明时遇到了一些麻烦(如果你不想解释“为什么”和“如何”,你可以跳进代码示例). 基本上,我有一些模板类声明两个私有成员函数.根据模板类型的实例化,我想使用一个或另一个函数. 因此,如果我不希望编译失败,则无法实例化我无法使用的私有函数.所以,我必
为什么我需要*来使检查器成为指针在线 模板< typename C> static yes test(checker< C,& C :: helloworld> *); 为了使编译时间扣除正常工作,输出1 0? 当我删除*时,输出为0 0 #include <iostream> struct Generic {}; struct Hello { int helloworld() { return 0; } }; // SFIN
我正在做一些模板元编程,我想实现一个通用的克隆函数,它根据SFINAE表达式的有效性选择克隆方法(替换失败不是错误). 在this reference website它说 The function make_unique<T>( std::forward<Args>(args)... ) is equivalent to: 06001 这是否意味着以下代码 template <ty
鉴于(减少)detection idiom的实施 namespace type_traits { template<typename... Ts> using void_t = void; namespace detail { template<typename, template<typename...> class, typename...> struct is_detected : std::fa
请考虑第一段代码,其中使用基本SFINAE触发器来区分类型是否是随机访问迭代器: template <typename T, typename = void> struct is_random_access_iterator : public std::false_type {}; template <typename T> struct is_random_access_iterator<T, std::enable_if_t<
我一定错过了C规范中的一些东西,因为我无法解释为什么以下代码成功编译: class MyClass { static void fun(); }; int main() { MyClass::MyClass::MyClass::fun(); } 有人能指出我的标准还是只是解释一下语义?我猜想只允许一个MyClass ::.两个MyClass :: MyClass ::应该导致错误.
我想专门化一个模板类构造函数: 如果type为int,则默认值为50和-50.如果它的浮动默认值应为0.5和-0.5. 我的代码是: #include <iostream> #include <limits> #include <type_traits> template<typename T> class Foo{ public: template<typename = typename std::enable_if<
我试图“迭代”一个可变参数派生类的所有基类,并调用一个名为“stream”的方法(如果它存在). 要检查方法是否存在,我使用sfinae,它可以工作(参见注释掉的代码).但是当我将它与可变参数模板“迭代”结合起来如果不起作用时,你的错误有点看起来像sfinae部分突然工作不像预期的那样,当
我试图在struct A中留下一个函数foo(打印0),如果它的参数有模板方法isA< void>和另一个(打印1),如果没有.这段代码(简化为下面的最小例子)编译(尝试使用gcc 6.1.0和clang-3.9.0以及显式–std = c 14选项)并运行. 但它打印1,但是,我确信,它将打印0.我想知道我错在哪里,但真正的问题
我想在模板类中为T的不同情况定义一个函数.我的问题是定义T是一个向量(无论它包含什么)的情况. 这是我的第一次尝试之一: template<typename T> class Test{ protected: T *val; public: Test(T* v):v(val){}; static string typeName(); }; template<typename T> str
某个表达式未定义时,是否可以启用函数模板(例如,xof类型t不能流式传输到std :: cout).就像是 template<typename t> auto f(const t &x) -> typename enable_if_undefined<decltype(std::cout << x)>::type; 使用SFINAE,我只看到如果定义表达式时如何启用,但是如果表达式未定
我发现这个代码与SFINAE一起: template<int I> void div(char(*)[I % 2 == 0] = 0) { // this overload is selected when I is even } template<int I> void div(char(*)[I % 2 == 1] = 0) { // this overload is selected when I is odd } 它是如何工作的?它看起来像一
我为operator []编写了简单的检查,但是has_subscript_op结构模板实例化选择了错误的重载: #include <iostream> #include <type_traits> #include <string> #include <map> template<class, class, class = void> struct has_subscript_op : std::false_type { }; templ
我有一个类似容器的类,其方法与std :: apply类似.我想用const限定符重载此方法,但是当我尝试使用泛型lambda调用此方法时,我从std :: invoke_result_t的实例化中得到了一个硬错误.我正在使用std :: invoke_result_t来推断方法的返回值以及对参数执行SFINAE检查. #include <type_tr
我正在尝试实现一个OutputArchive模板类,它具有模板化函数processImpl().看起来像这样: template<typename ArchiveType> class OutputArchive { ... template<typename Type, typename std::enable_if_t<std::is_arithmetic_v<Type>>> inline ArchiveType& p
我对cppreference.com中的以下引用感到困惑: This rule applies during overload resolution of function templates: When substituting the deduced type for the template parameter fails, the specialization is discarded from the overload set instead of causing a compi
我很困惑为什么以下使用boost :: enable_if的代码无法编译.它检查类型T是否具有成员函数hello,如果是这种情况则调用它: #include <iostream> #include <boost/utility/enable_if.hpp> #include <boost/static_assert.hpp> // Has_hello<T>::value is true if T has a hello funct