sfinae

    1热度

    1回答

    我想使用enable_if来为某些类型定义一个类。在这些类型中,我需要使用一些模板类型,并且我无法使其工作。这里是一个MWE: 模板类A: template<typename T, typename Enable = void> class A; 其专门为一些简单的类型,如整型这里,可以定义如下: template<typename T> class A<T, std::enable_if<

    2热度

    4回答

    在一个类中,我有两种不同的方法,根据调用者模板参数应该是相互排斥的。 class Foo { // For collections template<class T> typename boost::enable_if<boost::is_same<typename std::vector<typename T::value_type>, T>::value, co

    9热度

    2回答

    在C++中17,我们有std::void_t,这使得SFINAE看起来要好很多: template <typename T> std::void_t<decltype(T::prop)> foo() { /* stuff */ } 模板功能将只存在,如果存在T::prop。 如果T::prop存在,模板功能foo()将是相同的: template <typename T> void foo

    8热度

    1回答

    我有一个库,其中包含几个函数对象,根据std::is_integral只能接受几种类型的函数对象。当条件失败时,我想要std::is_invocable返回false,但是当用户试图调用函数对象的实例时,我也希望有一个不错的static_assert错误消息。下面是函数对象的简单例子,我现在有: struct function { template<typename Iterator>

    1热度

    1回答

    我想在编译时将函数的模板类型限制为特定的类及其子类。要做到这一点,我使用的类型性状std::enable_if_t和std::is_base_of这样的: template <typename T = std::enable_if_t<std::is_base_of<A, T> > > 但仍然模板与不继承层次结构(即int)的一部分类型的编译。下面是该问题的MCVE: class A { p

    1热度

    1回答

    我是SFINAE的新手。我注意到: template <typename T> void f(T t) { t.Crash(); } // version 1 void f(...) { } // The sink. f(1); template <typename T> void f(const T& t, typename T::iterator* it = nullptr) { }

    2热度

    1回答

    请考虑以下情况,我想检查我传递给其他某个函数的类型sf是否具有sf所需的成员函数T::mf,我知道返回类型和名称,但可以有任何数量的重载。 经过一些修补(好吧很有趣..)和谷歌搜索,我可以得到像下面的代码工作,问题是我不知道如何表示print可以有可变数量的参数。 #include <type_traits> #include <utility> template <typename T,

    8热度

    1回答

    后续的代码不能编译,因为结构A不支持--操作。 struct A {}; struct B { void Run() {} A& Dec(A& a) { return --a; } }; int main(int argc, char** argv) { B b; b.Run(); } 与此密码相同。 struct A {}; templ

    0热度

    1回答

    我有一个类,它包装一个枚举并为其提供字符串转换。现在我介绍了模板参数'fastStringConvert',它控制着如何使用SFINAE进行转换(在这里找到:how can I use std::enable_if in a conversion operator?)。代码在MSVC下编译,但在GCC和Clang下失败。 error: no type named ‘type’ in ‘struct

    1热度

    1回答

    我想根据给定的枚举模板参数(store_type)选择一个类模板。现在我实例化一个使用这个类的类,但它似乎总是尝试实例化这个类的basic_store。 enum store_type { none, basic, lockless, }; template<class T, store_type S = none, typename = void> str