草庐IT

c++ - “使用”声明为 SFINAE

我可以使用SFINAE(或其他技术)在using声明的同时从模板类派生private吗?为了更好地理解,请参阅下面的代码:#includestructS1{voidf(){std::coutstructD:privateT{usingT::f;//usingT::g;//needthisonlyifTprovidesg()function};intmain(){D().f();//ok.Prints'S1::f'D().f();//ok.Prints'S2::f'D().g();//fail.Butwantstobeokandprints'S2::g'return0;}我怎样才能达到期

c++ - 成员函数模板选择和SFINAE

我一直在努力理解C++选择模板的方式。即,考虑以下代码示例:templateclassCurious{public:template::value,int>::type=33>voidtest1(){}template::value,int>::type=33>voidtest1(){}template::value>::type>voidtest2(){}template::value>::type>voidtest2(){}template::value>::type*=nullptr>voidtest3(){}template::value>::type*=nullptr>voi

c++ - 具有 C++14 返回类型推导的 SFINAE

多亏了C++14,我们很快就能减少冗长的尾随返回类型;例如来自DavidAbrahams2011post的通用min示例:templateautomin(Tx,Uy)->typenamestd::remove_reference::type{returnx在C++14下返回类型可以省略,min可以写成:templateautomin(Tx,Uy){returnx这是一个简单的例子,但是返回类型推导对于泛型代码非常有用,可以避免很多重复。我的问题是,对于这样的功能,我们如何集成SFINAE技术?例如,我如何使用std::enable_if来限制我们的min函数返回整数类型?

c++ - boost::enable_if 不在函数签名中

这只是一个关于样式的问题:我不喜欢C++的模板元编程方式,它要求您使用返回类型或为SFINAE的技巧添加额外的虚拟参数。所以,我想到的是将SFINAE放在模板参数定义本身中,如下所示:#include#include#includeusingnamespacestd;template>::type>voidasd(){cout>::type>voidasd(){cout();asd();}这个例子让g++提示:../src/afg.cpp:10:97:error:redefinitionof‘templatevoidasd()’SFINAE本身可以工作,因为如果我删除例如带有disab

c++ - SFINAE: 'static_cast<void>()' 或 ', void()'?

在任意类型上执行SFINAE时,通常需要将表达式的结果转换为void。我见过两种方法;转换为无效:(void)(expr)//orstatic_cast(expr)或者,或者,使用带有voidprvalueRHS的逗号运算符:(expr),void()据我了解,在这两种情况下,expr都会被求值(为了格式良好,在非求值上下文中)并丢弃结果(或结果类型,在非求值上下文中);在任何一种情况下,即使是病态类T也无法覆盖T::operatorvoid()或operator,(T,void)。(参见:Whyis"operatorvoid"notinvokedwithcastsyntax?、Wha

c++ - 带 std::get 的 SFINAE constexpr

这是DetectingconstexprwithSFINAE的后续问题.我想检测元组的元素(或任何可以与std::get一起使用的元素)是否为constexpr。所以我写了以下类似于Xeo给出的助手:templatestructsfinae_true:std::true_type{};templateautocheck(constT&arg)->sfinae_true(arg),N)>;templatestd::false_typecheck(...);现在我的测试驱动程序代码:intmain(){constexprstd::tuplearg(4,5);typedefdecltype(

c++ - 这是在 C++03 中执行 "Expression SFINAE"的有效方法吗?

在C++11中,SFINAE很容易判断一个表达式是否有效。例如,想象一下检查某些内容是否可流式传输:templateautoprint_if_possible(std::ostream&os,constT&x)->decltype(osprint_if_possible如果os,将只参与过载决议是一个格式正确的表达式。liveexampleongodbolt.org我需要在C++03中做同样的事情,我发现sizeof可以提供帮助(因为我需要一个未评估的表达式上下文)。这是我想出的:templatestructsfinaer{};templatevoidprint_if_possible

c++ - 为什么即使我有未定义的成员函数,以下代码也能编译?

我在处理这段代码的过程中进行了一半,并认为这显然不会编译,然后才按下构建按钮。令我惊讶的是,它不仅可以编译,而且还可以链接和工作。如果我猜我会说SFINAE负责编译...是吗?structBaseClass{public:BaseClass(){}templateBaseClass(constT&a_other){inti=0;//forbreakpoint}templateBaseClass&operator=(constT&a_other){inti=0;//forbreakpointreturn*this;}private:BaseClass(constBaseClass&a_o

c++ - 为什么 Member Detector fallback 必须是 int?

我以为我正在理解这个类(从这里https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Member_Detector):templateclassDetectX{structFallback{intX;};//addmembername"X"structDerived:T,Fallback{};templatestructCheck;typedefcharArrayOfOne[1];//typedefforanarrayofsizeone.typedefcharArrayOfTwo[2];//typedefforanarrayofsizetw

c++ - SFINAE 测试来自另一个命名空间的自由函数

我试图想出一个hack来测试std::isnan是否在预处理器中没有特殊外壳编译器的情况下定义,并想出了以下内容,我希望它能正常工作.#include#includenamespacedetail{usingnamespacestd;structdummy{};voidisnan(dummy);//boolisnan(float);//Justaddingthisdeclarationmakesitwork!templatestructis_isnan_available{templatestaticdecltype(isnan(T1()))test(int);templatestat