首页 > TAG信息列表 > SFINAE

SFINAE几种实现方式

一、通过函数返回值实现 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用法的测试程序

boost::hana::sfinae用法的测试程序 实现功能 C++实现代码 实现功能 boost::hana::sfinae用法的测试程序 C++实现代码 #include <boost/hana/assert.hpp> #include <boost/hana/config.hpp> #include <boost/hana/equal.hpp> #

c-SFINAE检查表达式是否编译并返回std :: true_type

这个问题已经在这里有了答案:            >            Is it possible to write a template to check for a function’s existence?                                    25个 如果要编译以下表达式,我想获取std ::

c-检查类是否具有指针数据成员

有没有一种方法可以测试一个类是否具有指针数据成员? class Test { int* p; } template< typename T > foo( T bla ) { } 这不应该编译.因为Test具有指针数据成员. Test test; foo( test ) 也许我可以使用特征来禁用模板?还是我唯一的选择宏?也许有人知道boost可以做到吗?解决方

c – std :: experimental :: is_detected的奇怪MSVC行为

我实现了基于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

c – 检查是否存在(重载)成员函数

关于检查成员函数是否存在,有许多已回答的问题:例如, Is it possible to write a template to check for a function’s existence? 但是,如果函数重载,此方法将失败.这是一个稍微修改过的代码,来自该问题的最高评价答案. #include <iostream> #include <vector> struct Hello {

c – 什么特性/概念可以保证memsetting一个对象是明确定义的?

假设我已经定义了一个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()会导致未定义的行

c – 静态断言和SFINAE

考虑一下: 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(

C 11样式SFINAE和模板实例化时的功能可见性

我不确定这与sfinae有什么关系,或者只是与任何模板化函数相关的东西.我试图使用sfinae根据相应的自由函数的存在来启用/禁用成员函数,而后者又基于另一种类型的成员函数的存在来启用/禁用,所有使用描述的方法here: struct S; template <typename T> inline auto f(S& s, T const&

C 98/03 std :: is_constructible实现

我的爱好库的基本组件必须与C 98和C 11编译器一起使用.为了学习和享受自己,我创建了几种类型支持功能的C 98实现(如enable_if,conditional,is_same,is_integral等…),以便在没有C 11支持时使用它们. 然而,当我实现is_constructible时,我被卡住了.有没有任何模板魔术(某种SFINAE),我

c – 使用sfinae的std :: hash特化?

作为练习,我试图看看当所有模板参数都是无符号类型时,我是否可以使用SFINAE为std :: pair和std :: tuple创建std :: hash特化.我对它们有一点经验,但据我所知,哈希函数需要已经使用typename Enabled = void进行模板化,以便我添加一个特化.我不确定从哪里开始.这是一种无效的尝试.

c – SFINAE尝试用bool给出了编译错误:“模板参数’T :: value’涉及模板参数”[复制]

参见英文答案 > Why is it disallowed for partial specialization in a non-type argument to use nested template parameters                                    2个 我尝试使用bool实现SFINAE(与流行的void_trick不同): template<type

c – 如何确定是否存在模板专业化

我想检查某个模板专业化是否存在,其中一般情况没有定义. 鉴于: template <typename T> struct A; // general definition not defined template <> struct A<int> {}; // specialization defined for int 我想定义一个像这样的结构: template <typename T> struct IsDefined {

c – 为什么SFINAE(enable_if)不适用于类模板的成员函数?

#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>::

c – 使用SFINAE检查全局运算符<<?

我想有几个重载的全局to_string()函数,它们采用某种类型T并将其转换为其字符串表示形式.对于一般情况,我希望能够写: template<typename T,class OutputStringType> inline typename enable_if<!std::is_pointer<T>::value && has_insertion_operator<T>::value,

c – 什么是带有两个参数的decltype?

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

c – 从模板检查成员函数重载是否存在

是否可以从模板成员函数中检查类是否具有某个成员函数重载? 我能找到的最好的类似问题是这个:Is it possible to write a template to check for a function’s existence?据我所知,这不适用于检查函数重载的情况. 这是一个如何应用它的简化示例: struct A; struct B; class C { pub

c – SFINAE会员通过

我想知道是否有可能创建一个类作为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

c – 在参数类型中存在或不存在POD结构成员时专门化模板函数

给定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;

c – 使用SFINAE检测是否有(增强)范围

对于日志代码,我想检测模板函数的给定参数是否可以使用Boost.Range中的工具进行迭代.显然我需要实例化不同的代码,不管是不是,所以我需要SFINAE,可能(当然)与boost :: enable_if结合使用.我试过检测是否定义了开始和结束自由函数,如下所示: namespace is_range_impl { template

c – remove_pointer analog适用于任何支持operator *的东西

我想要的东西具有类似于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中制作基于SFINAE的Y组合器?

我正在考虑C 14的隐式模板,我正在尝试声明一个函数来匹配特定的参数类型(SFINAE和特征仍让我头疼).我不知道如何解释我想要的东西,但我正在尝试制作一个Y combinator(只是为了看看它是否可行,不是用于制作). 我正在尝试声明一个函数: template<typename T> my_traits<T>::return_ty

c – 如何判断某物是否是容器?

我想确定某件事是否是一个容器.现在我正在对格式化为具有类型和分配器的容器进行测试.我的最终目标是学习如何编写容器模板,当包含自身层时,可以允许直接迭代其最内层元素.例如.如果有一个容器包含3个容器,每个容器包含3个容器,每个容器包含3个元素,我希望能够基于循环迭代一个范围

c – 使用= delete进行接口描述

我试图为自由函数listenTo(SomeAnimal)提供一个接口描述,该函数应该在满足特定类型要求的类型上运行(它应该是动物).函数参数不应该使用纯虚方法的接口继承机制. 我破解了一个解决方案,其中free函数通过sfinae语句检查参数类型的基类.为了保证参数实现基类的接口,我使用= delete删

c – 如何使用默认模板参数分隔模板化类的声明和实现?

我喜欢将我的类的声明和实现分开.我知道类模板和函数的实现也必须进入头文件,这不是问题. 我在实现这个课时遇到了麻烦: template <size_t S, std::enable_if_t<(S > 0), int> = 0> class Foo { public: Foo(); } 到目前为止,我尝试过: template<size_t S> Foo<S>::Foo() {}