草庐IT

c++ - 将 lambda 作为参数传递时重载函数

我正在尝试在返回参数为void或T时实现模板函数。我使用sfinae尝试了上述代码的不同变体,但仍然不确定在lamdba是函数参数的情况下这通常是否可行。以下代码无法编译:#includetemplateTApply(conststd::function&func){returnfunc();}templatevoidApply(conststd::function&func){func();}intmain(intargc,char*argv[]){inti1=Apply([](){return10;});boolb1=Apply([](){returntrue;});Apply([

c++ - 使用 "if constexpr"和 SFINAE 禁用分支

我想在编译时启用/禁用分支,这取决于是否可以使用某些参数调用函数。ifconstexpr条件必须包含什么?我可以通过std::result_of(decltype(add)(A,B))获取结果类型,但是如何检查结果类型是否有效?(即如何将此信息转换为bool?)constautoadd=[](constautoa,constautob){returna+b;};constautosubtract=[](constautoa,constautob){returna-b;};templatevoidfoo(Aa,Bb){ifconstexpr(/*canadd(a,b)becalled?*

c++ - 在不同的命名空间中测试特定的类名(SFINAE?)

假设我在不同的命名空间中有几个同名的类。namespaceA{classFoo{...};}namespaceB{classFoo{...};}namespaceC{classFoo{...};}如果类名为Foo,我想在编译时进行检测尽管命名空间。例如一些SFINAE类,templatestructis_Foo{staticconstboolvalue=/*somemagichere*/;};那我要is_Foo::value是真的,is_Foo::value是真的,is_Foo::value是假的。然后,我想使用is_Foo在static_assert或std::enable_if.可

c++ - 基于依赖类型的存在重载

我有两个同名的模板函数(foo)。它们的签名仅在第二个参数的类型上有所不同,这取决于模板参数T。令我感到惊讶的是,我可以根据T::A或T::B是否存在类型来使用它来重载。这是标准中专门提供的东西吗(如果是这样,将不胜感激),还是我只是太过拘泥于没有将其识别为基本的重载解决方案?#includeusingnamespacestd;templatevoidfoo(Tt,typenameT::A*a=0){coutvoidfoo(Tt,typenameT::B*b=0){cout作为背景,我在研究std::enable_shared_from_this的实现时发现这是可能的,它依赖于这种类型

c++ - 检查 SFINAE 是否存在类型声明

我想使用SFINAE根据模板参数是否声明类型T来重载函数模板。到目前为止,这是我能够做到的:structC1{usingT=int;};structC2{usingT=void;//butIwouldreallylike//tonotrequireTatall};//ForclassesthatdeclareTtemplatevoidf(C&c,typenamestd::enable_if::value,int>::type=0){(void)c;std::coutvoidf(C&c,typenamestd::enable_if::value,int>::type=0){(void)c

c++ - 检查类 T 是否具有带有 void_t 的成员类型 Member

代码如下:templatestructhas_member_type:false_type{};templatestructhas_member_type>:true_type{};structfoo{usingbar=int;};intmain(){std::cout::value;}我正在尝试检查foo是否有bar类型的成员。如果实现不指定类型成员的名称,它工作正常,但这样名称被硬编码到实现中,这对我不起作用。据说重复的问题并不能回答我的问题。正如我在上面的段落中解释的那样,当类型被硬编码到实现中时它很好,但是当我从外部指定类型时我无法让它工作(这是特定问题)。代码编译正常,但产生

C++-14 使用 enable_if_t 选择整数类型模板化类的成员函数

我正在尝试基于一个完整的类模板参数启用不同的成员函数,如下所示:#includetemplatestructFoo{template=0>intbar(inti)const{returni;}template=0>intbar(inti,intj)const{returni+j;}};intmain(intargc,constchar**argv){Fooa;a.bar(1);Foob;b.bar(1,2);return0;}在c++-14模式下使用gcc5,编译失败,出现如下错误:tools/t1.cpp:Ininstantiationof'structFoo':tools/t1.c

c++ - 有没有一种方法可以基于当前类中的可用重载来进行 SFINAE?

我已经使用这样的代码有一段时间了(至少从GCC4.9/Clang3.5开始):#includeclassfoo{public:voidbar(intn);template().bar(*std::begin(std::declval())))>voidbar(constR&range);};第二点bar()除非R,否则它应该被SFINAE移除是一个范围类型,其中重载了bar()为其元素而存在。所以std::vector会很好但是std::vector例如,不会。不幸的是,从Clang3.9开始,出现了这个错误:templ.cpp:12:54:error:memberaccessinto

c++ - SFINAE 检查 std::less 是否有效

在我的代码中,如果一个对象小于另一个对象,我希望一个操作先于另一个操作发生。但是,如果类型不可比较,则顺序无关紧要。为此,我尝试使用SFINAE:template>()(std::declval(),std::declval()))>boolComparableAndLessThan(constT&lhs,constT&rhs){returnstd::less()(lhs,rhs);}boolComparableAndLessThan(...){returnfalse;}structfoo{};intmain(){fooa,b;if(ComparableAndLessThan(a,b)

c++ - SFINAE 检查运算符的存在(没有 decltype)

我正在尝试做我学校的一个旧项目,它处理C++98中的元编程。我挣扎的部分是关于SFINAE。主题说我应该检查operator通过使用这样的结构在流对象和另一个对象之间工作:templatestructIsPrintable;它说我应该用“两个空引用”写一个奇怪的行,我想它应该是这样的:sizeof(*(static_cast(NULL))(NULL)))它在运算符受支持时工作,但在不支持时无法编译。我不知道我在哪里失败了,这是文件:templatestructIsPrintable{typedefcharyes[1];typedefcharno[2];templatestructTes