enable-if 相关问题

`std :: enable_if`是一个C ++元函数模板,参数`bool B`,`class T = void`,在标准C ++头文件`type_traits`中定义。如果`B`为真,则实例化类定义一个等于`T`的公共成员类型`type`;否则它没有。

当所有模板参数均为同一类型时的部分模板特化

在 C++14 中是否可能(因此没有约束、require 或折叠表达式,但有 SFINAE)对类模板进行部分模板特化 模板 基因类...

回答 1 投票 0

使模板类方法参数类型与类模板参数相同(包括void)

想要使类方法具有与类模板参数匹配的签名,例如,对于一个类,如果 T 不为 void,则有 Class::Method(T t),如果 T 则有 Class::Method()无效。 编译...

回答 1 投票 0

std::is_base_of 和虚拟基类

有没有办法识别基类是否是虚拟基类? std::is_base_of 将识别基类,但我正在寻找类似 std::is_virtual_base_of 的东西来识别

回答 4 投票 0

使用 std::enable_if<> 来避免模棱两可的模板化二元运算符重载

我想使用 std::enable_if<> 来避免 MyClass*otherT 与 otherT*MyClass 与 MyClassT*MyClassT 中的歧义重载运算符*(T,U)(或重新定义) 可以说 MyClass 声明是: 寺庙...

回答 2 投票 0

如何让这个enable_if表达式更简单?

我想确认指针类型是: 不是函数指针(即指向 lua_CFunction 的指针) 不是指向 std::string 的指针 不是指向 char 的指针 不是指向 unsigned char 的指针 模板 我想确认指针类型是: 不是函数指针(即指向 lua_CFunction 的指针) 不是指向 std::string 的指针 不是指向 char 的指针 不是指向 unsigned char 的指针 template <typename T, typename std::enable_if<(!std::is_same<lua_CFunction, T*>::value) && std::is_pointer<T>::value && (!std::is_same<std::string*, T>::value) && (!std::is_same<unsigned char, std::remove_cv<std::remove_pointer<T>>>::value) && (!std::is_same< char, std::remove_cv<std::remove_pointer<T>>>::value)> ::type* = nullptr> 如何让这个表达更简单? 如何使这个表达式更简单(更易读且更短)? 由于您只允许使用 c++11,因此您可以为所有条件创建类型特征,如下所示。 template<typename T> struct checkT { static constexpr bool value = (!std::is_same<lua_CFunction, T*>::value) && std::is_pointer<T>::value && (!std::is_same<std::string*, T>::value) && (!std::is_same<unsigned char, std::remove_cv<std::remove_pointer<T>>>::value) && (!std::is_same< char, std::remove_cv<std::remove_pointer<T>>>::value); }; template <typename T, typename std::enable_if<checkT<T>::value, void>::type> void f(); 请注意,您如何实现不同的检查可能会出现逻辑错误,但这个问题特别询问如何缩短代码。

回答 1 投票 0

C++ std::enable_if 模板类的成员模板函数重载

我正在尝试在类中“重载”模板函数,具体取决于专业化参数的父模板类。但是,我收到以下错误。 错误 C2938:'std::enable_if_t 我正在尝试在类中“重载”模板函数,具体取决于专业化参数的父模板类。但是,我收到以下错误。 错误 C2938:'std::enable_if_t':无法专门化别名模板 这里出了什么问题? #include <memory> #include <type_traits> template <template <typename...> class BaseTemplate, typename Derived, typename TCheck = void> struct test_base_template; template <template <typename...> class BaseTemplate, typename Derived> using is_base_template_of = typename test_base_template<BaseTemplate, Derived>::is_base; //Derive - is a class. Let inherit from Derive, so it can cast to its protected parents template <template <typename...> class BaseTemplate, typename Derived> struct test_base_template<BaseTemplate, Derived, std::enable_if_t<std::is_class_v<Derived>>> : Derived { template<typename...T> static constexpr std::true_type test(BaseTemplate<T...>*); static constexpr std::false_type test(...); using is_base = decltype(test((test_base_template*) nullptr)); }; //Derive - is not a class, so it always false template <template <typename...> class BaseTemplate, typename Derived> struct test_base_template<BaseTemplate, Derived, std::enable_if_t<!std::is_class_v<Derived>>> { using is_base = std::false_type; }; template<typename type> class MyClass { public: template <typename Dummy = type, typename std::enable_if_t<is_base_template_of<std::weak_ptr, type>::value, bool> = bool()> std::shared_ptr<typename type::element_type> get() { return m_data.lock(); } template <typename Dummy = type, typename std::enable_if_t<is_base_template_of<std::shared_ptr, type>::value, bool> = bool()> std::shared_ptr<typename type::element_type> get() { return m_data; } private: type m_data; }; int main() { MyClass<std::weak_ptr<int>> t; auto a1 = t.get(); MyClass<std::shared_ptr<int>> t2; auto a2 = t2.get(); } 阅读了此线程模板类的 std::is_base_of 这是否意味着根据 m_data 类型一次不可能拥有这些功能之一? 您可以使用constexpr if,如下所示: template<typename type> class MyClass { public: std::shared_ptr<typename type::element_type> get() { if constexpr(is_base_template_of<std::weak_ptr, type>::value) { return m_data.lock(); } else if constexpr(is_base_template_of<std::shared_ptr, type>::value) { return m_data; } //make sure that this non-void returning function returns something if control reaches here } }; 工作演示

回答 1 投票 0

未调用 C++ enable_if 类特化

我有以下尝试使用enable_if来实例化A类的2个不同专业化的示例,但我没有正确理解它,因为它们没有被调用,任何建议...

回答 1 投票 0

为什么 std::enable_if 不能作为附加函数参数应用于运算符重载?

根据 cppreference 文档,其中表示(强调我的): std::enable_if 可以以多种形式使用,包括: 作为附加函数参数(不适用于运算符重载), 作为

回答 1 投票 0

使用enable_if进行模板专门化对于函数和类的行为不同

我正在尝试使用enable_if根据模板参数的类型专门化函数模板,类似于此处的示例https://en.cppreference.com/w/cpp/types/enable_if 模板 我正在尝试使用类似于此处示例的enable_if基于模板参数的类型来专门化函数模板https://en.cppreference.com/w/cpp/types/enable_if template<typename Type, typename Enabled = void> void foo(Type t) { std::cout << "primary\n"; std::cout << std::is_same<decltype(t), A>::value << "\n"; } template<typename Type, typename std::enable_if_t<std::is_same<Type, A>::value>::type> void foo(Type t) { std::cout << "specialized\n"; } 但是在这种情况下,仅调用主要定义。如果我尝试对课程做同样的事情 template <class T, class Enable = void> struct Foo { static void bar() { std::cout << "T is blah" << std::endl; } }; template <class T> struct Foo<T, typename std::enable_if<std::is_integral<T>::value>::type> { static void bar() { std::cout << "T is int" << std::endl; } }; 它实现了预期的行为: int main() { A a; // not specializing foo<A>(a); // primary called foo(19); // primary called // does specializing Foo<int>::bar(); // int specialization is called Foo<float>::bar(); // generic is called return 0; } 有人可以向我解释一下这种差异吗?是否有一种方法可以在不使用类的情况下实现所需的行为? 我的代码示例: https://godbolt.org/z/86jsxfqdG 函数模板不能像类模板那样部分特化,它们可以重载。例如 template<typename Type> typename std::enable_if_t<!std::is_same<Type, A>::value> foo(Type t) { std::cout << "primary\n"; } template<typename Type> typename std::enable_if_t<std::is_same<Type, A>::value> foo(Type t) { std::cout << "specialized\n"; } 直播

回答 1 投票 0

std::enable_if_t typedef 替换不等效

我经常为类创建一个 this_type typedef 以缩短成员函数签名。 然而,我在使用 std::enable_if_t 时遇到了这个奇怪的情况。 #包括 #包括 #

回答 1 投票 0

带有 std::enable_if 的嵌套模板类,C++

我有一个模板类B,其第一个参数T1必须继承类A,第二个参数T2用于嵌套类C: A 类 { ... }; 模板 我有一个模板类B,其第一个参数T1必须继承类A,第二个参数T2用于嵌套类C: class A { ... }; template<typename T1, typename T2 = T1, typename = std::enable_if_t<std::is_base_of<A, T1>::value>> class B { class C { T2 data; C(T2 data); void func(); ... }; ... }; 问题是当我尝试定义嵌套类的构造函数和方法时出现错误: template<typename T1, typename T2, typename> B<T1, T2>::C::C(T2 data) : data(data) { ... } template<typename T1, typename T2, typename> void B<T1, T2>::C::func() { ... } E0464“B::value, void>>::C”不是类模板; C3860 类类型名称后面的类型参数列表必须按照类型参数列表中使用的顺序列出参数。 如果我不使用嵌套类或不使用 std::enable_if,代码可以正常工作,但在这里我需要它们,而且我真的不明白出了什么问题。 定义构造函数时仍然需要提供默认的模板参数: template<typename T1, typename T2, typename D> B<T1, T2, D>::C::C(T2 data) : data(data) { } 或者,由于最后一个参数仅用于 SFINAE 目的并且始终旨在为 void,因此您可以编写: template<typename T1, typename T2> B<T1, T2, void>::C::C(T2 data) : data(data) { } 请注意,最好在 C 中定义构造函数。 无论如何,大多数时候你都无法将模板拆分为标头/源代码,并且处理类模板的外线定义可能非常烦人且脆弱。 C++17 和 C++20 的注意事项 如果您使用的是 C++20,您可以编写: template<std::derived_from<A> T1, typename T2 = T1> class B { /* ... */ }; template<std::derived_from<A> T1, typename T2> B<T1, T2>::C::C(T2 data) : data(data) { } 如果您使用的是 C++17,您至少可以使用辅助变量模板std::is_base_of_v<A, T1>。

回答 1 投票 0

为什么未使用的成员模板函数和成员函数声明的隐式实例化类模板实例化失败

这有什么问题: #包括 结构体A; 模板 结构B { 模板::值>> ...

回答 3 投票 0

为什么 SFINAE (enable_if) 不适用于类模板的成员函数? [重复]

#包括 结构体A{}; 结构体 B{}; 模板 结构体Foo { 类型名 std::enable_if::value>::type 酒吧() {} 输入...

回答 1 投票 0

为什么模板参数中的enable_if_t会抱怨重新定义?

我有以下使用 std::enable_if 的情况: 模板::值>::类型* = nullptr> 无效 f() { } 你...

回答 5 投票 0

std::is_convertible 中的 std::decay 是多余的吗?

我写了这样的代码: 模板 A类{ 模板 ,std::decay_t>>> ...

回答 1 投票 0

如何仅在两种类型为 std::complex 或非 std::complex 时启用方法?

在模板类中,仅当类类型和方法类型为 std::complex 或两者都不复杂时,我才想启用函数。 模板 M 类{ 民众: 模板<

回答 1 投票 0

使用 constexpr、SFINAE 和/或 type_traits 进行 char*、char 数组和字符串文字的重载解析

我遇到了一个有趣的挑战,我花了几个小时试图解决这个挑战,但经过大量研究和多次失败的尝试后,我发现自己在问这个问题。 我想写3

回答 2 投票 0

如何根据模板参数有条件地声明局部变量?

我想根据模板布尔参数有条件地在函数中声明局部变量。所以如果这是真的,它应该在那里,否则不应该在那里,因为我不……

回答 5 投票 0

如果可能的话,如何将enable_if_t模板限制应用于具有单独实现代码的整个类?

注意:我更喜欢始终将实现与声明分开,即使对于仍必须位于标头中的模板代码也是如此。所以我倾向于有一个 .h 文件用于声明,并且在

回答 1 投票 0

使用enable_if和SFINAE时,函数参数类型推导(标准容器,例如向量)失败[重复]

我似乎不知道我哪里出了问题。 参见 https://ideone.com/WKsZSN 我正在尝试创建一个仅当其参数是某种暴露 t 的模板化类时才存在的函数...

回答 3 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.