一、通过函数返回值实现 template<class T> typename std::enable_if<std::is_trivially_default_constructible<T>::value>::type construct(T*) { std::cout << "default constructing trivially default constructible T\n"; } templ
boost::hana::sfinae用法的测试程序 实现功能 C++实现代码 实现功能 boost::hana::sfinae用法的测试程序 C++实现代码 #include <boost/hana/assert.hpp> #include <boost/hana/config.hpp> #include <boost/hana/equal.hpp> #
这个问题已经在这里有了答案: > Is it possible to write a template to check for a function’s existence? 25个 如果要编译以下表达式,我想获取std ::
有没有一种方法可以测试一个类是否具有指针数据成员? class Test { int* p; } template< typename T > foo( T bla ) { } 这不应该编译.因为Test具有指针数据成员. Test test; foo( test ) 也许我可以使用特征来禁用模板?还是我唯一的选择宏?也许有人知道boost可以做到吗?解决方
我实现了基于on this article on cppreference.com的std :: experimental :: is_detected(部分代码低于工作repro). 它适用于G和Clang,但导致MSVC的奇怪错误行为:is_detected似乎总是bool_constant< true>! 在这里,您可以使用gcc 5.x查看正确的结果: @ideone.com 但是使用MSVC 19(随VS
关于检查成员函数是否存在,有许多已回答的问题:例如, Is it possible to write a template to check for a function’s existence? 但是,如果函数重载,此方法将失败.这是一个稍微修改过的代码,来自该问题的最高评价答案. #include <iostream> #include <vector> struct Hello {
假设我已经定义了一个zero_initialize()函数: template<class T> T zero_initialize() { T result; std::memset(&result, 0, sizeof(result)); return result; } // usage: auto data = zero_initialize<Data>(); 为某些类型调用zero_initialize()会导致未定义的行
考虑一下: template <typename T> struct hash { static_assert(false,"Not implemented."); }; struct unhashable {}; template <typename T> auto test(const T &t) -> decltype((*(hash<T> const *)nullptr)(t),int); void test(
我不确定这与sfinae有什么关系,或者只是与任何模板化函数相关的东西.我试图使用sfinae根据相应的自由函数的存在来启用/禁用成员函数,而后者又基于另一种类型的成员函数的存在来启用/禁用,所有使用描述的方法here: struct S; template <typename T> inline auto f(S& s, T const&
我的爱好库的基本组件必须与C 98和C 11编译器一起使用.为了学习和享受自己,我创建了几种类型支持功能的C 98实现(如enable_if,conditional,is_same,is_integral等…),以便在没有C 11支持时使用它们. 然而,当我实现is_constructible时,我被卡住了.有没有任何模板魔术(某种SFINAE),我
作为练习,我试图看看当所有模板参数都是无符号类型时,我是否可以使用SFINAE为std :: pair和std :: tuple创建std :: hash特化.我对它们有一点经验,但据我所知,哈希函数需要已经使用typename Enabled = void进行模板化,以便我添加一个特化.我不确定从哪里开始.这是一种无效的尝试.
参见英文答案 > Why is it disallowed for partial specialization in a non-type argument to use nested template parameters 2个 我尝试使用bool实现SFINAE(与流行的void_trick不同): template<type
我想检查某个模板专业化是否存在,其中一般情况没有定义. 鉴于: template <typename T> struct A; // general definition not defined template <> struct A<int> {}; // specialization defined for int 我想定义一个像这样的结构: template <typename T> struct IsDefined {
#include <type_traits> struct A{}; struct B{}; template <typename T> struct Foo { typename std::enable_if<std::is_same<T, A>::value>::type bar() {} typename std::enable_if<std::is_same<T, B>::value>::
我想有几个重载的全局to_string()函数,它们采用某种类型T并将其转换为其字符串表示形式.对于一般情况,我希望能够写: template<typename T,class OutputStringType> inline typename enable_if<!std::is_pointer<T>::value && has_insertion_operator<T>::value,
Edit, in order to avoid confusion: decltype does not accept two arguments. See answers. 以下两个结构可用于在编译期间检查类型T上的成员函数是否存在: // Non-templated helper struct: struct _test_has_foo { template<class T> static auto test(T* p) -> dec
是否可以从模板成员函数中检查类是否具有某个成员函数重载? 我能找到的最好的类似问题是这个:Is it possible to write a template to check for a function’s existence?据我所知,这不适用于检查函数重载的情况. 这是一个如何应用它的简化示例: struct A; struct B; class C { pub
我想知道是否有可能创建一个类作为std :: enable_if和SFINAE成员检测器之间的组合. class foo { public: int bar; }; template <class T> typename enable_if_has_bar<T>::type ReturnBar (const T& value) { return value.bar; } 所以我试图这样做. class foo { publ
给定POD结构的一般形式 struct case_0 { const char *foo; }; struct case_1i { const char *foo; int v0; }; struct case_1d { const char *foo; double v0; }; struct case_2ii { const char *foo; int v0; int v1;
对于日志代码,我想检测模板函数的给定参数是否可以使用Boost.Range中的工具进行迭代.显然我需要实例化不同的代码,不管是不是,所以我需要SFINAE,可能(当然)与boost :: enable_if结合使用.我试过检测是否定义了开始和结束自由函数,如下所示: namespace is_range_impl { template
我想要的东西具有类似于std :: remove_pointer的语义,但除了真正的指针之外,还适用于指针类.当然,我可以列举已知的可能性: // Important: remove_pointer_ex<T>::type should evaluate to T // if T::operator* is not defined (like std::remove_pointer) template<typename T> s
我正在考虑C 14的隐式模板,我正在尝试声明一个函数来匹配特定的参数类型(SFINAE和特征仍让我头疼).我不知道如何解释我想要的东西,但我正在尝试制作一个Y combinator(只是为了看看它是否可行,不是用于制作). 我正在尝试声明一个函数: template<typename T> my_traits<T>::return_ty
我想确定某件事是否是一个容器.现在我正在对格式化为具有类型和分配器的容器进行测试.我的最终目标是学习如何编写容器模板,当包含自身层时,可以允许直接迭代其最内层元素.例如.如果有一个容器包含3个容器,每个容器包含3个容器,每个容器包含3个元素,我希望能够基于循环迭代一个范围
我试图为自由函数listenTo(SomeAnimal)提供一个接口描述,该函数应该在满足特定类型要求的类型上运行(它应该是动物).函数参数不应该使用纯虚方法的接口继承机制. 我破解了一个解决方案,其中free函数通过sfinae语句检查参数类型的基类.为了保证参数实现基类的接口,我使用= delete删
我喜欢将我的类的声明和实现分开.我知道类模板和函数的实现也必须进入头文件,这不是问题. 我在实现这个课时遇到了麻烦: template <size_t S, std::enable_if_t<(S > 0), int> = 0> class Foo { public: Foo(); } 到目前为止,我尝试过: template<size_t S> Foo<S>::Foo() {}