草庐IT

c++ - 使用 SFINAE 在 GCC 和 Clang 上给出不同的结果

我正在学习如何利用SFINAE来发挥我的优势。我正在尝试使用它来根据serialize()的存在来选择函数实现在对象中运行。这是我用来确定类型是否定义了serialize()函数的代码:templateclassHasSerialize{private:typedefcharyes[1];typedefcharno[2];templatestaticyes&test(char[sizeof(&C::serialize)]);templatestaticno&test(...);public:staticconstboolvalue=sizeof(test(0))==sizeof(yes

c++ - 这个 SFINAE 模式有名字吗?

在“太阳底下没有新鲜事”的规则下运作,我怀疑我是第一个想出这个把戏的人。我想我最终会偶然发现一些在线记录它的东西,但我还没有,所以我想我会问。它的目的是在不使用派生类的情况下有选择地启用某些相关的功能。这个图案有名字吗?有没有人有任何关于这种模式或类似运作模式的有用信息?templateclassPoint{public:templateusingEnable2D=typenamestd::enable_if::type;templateusingEnable3D=typenamestd::enable_if::type;templateusingEnable4D=typenamest

C++:检查表达式是否编译的模板

在使用SFINAE编写模板特化时,您经常会因为一个不存在的小成员或函数而需要编写一个全新的特化。我想将此选择打包成一个小声明,如orElse.小例子:templateintget(T&v){returnorElse();}这可能吗? 最佳答案 orElse()的意图很清楚,但如果这样的事情可能存在,它必须是以下之一:召唤阵容orElse(v,&V::get,0)orElse(v,0)orElse(v)哪里v类型为V,以及由此实例化的函数模板分别是:函数模板阵容templateintorElse(T&obj,int(T::pmf*)(

c++ - SFINAE : Detecting if a function is called by a compile time known value

我喜欢在我的一个ctors以编译时已知值被调用时做一些检查。有办法检测吗?所以当有人调用它时:Aa(10);因为10是编译时已知常量,所以我喜欢调用一个特殊的构造函数,如下所示:template>A(intValue){}知道如何解决这个问题吗?谢谢! 最佳答案 积分常量可以解决您的问题:structA{template*=nullptr>A(std::integral_constant){}};然后,你可以像这样使用它:Aa{std:integral_constant{}};为了便于使用,您还可以使用类似于boost::hana的

c++ - C1001 : An internal error has occurred in the compiler

这应该是不言自明的。我正在尝试实现分布排序,但MSVC编译器崩溃了。这似乎是用我的SFINAE检测成员函数的特定情况,如果我不将indexert传递给函数,或者替换has_get_index,这似乎不会发生。如果我删除剩余的索引器重载中的任何一个,它也不会发生。如果sortable有一个getIndex()const成员,问题仍然存在。1>test.cpp(34):fatalerrorC1001:Aninternalerrorhasoccurredinthecompiler.1>(compilerfile'msc1.cpp',line1420)1>Toworkaroundthispro

c++ - boost::enable_if_c 似乎不起作用

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Howtouseenable_iftoenablememberfunctionsbasedontemplateparameterofclass我有一个类模板:templateclassVector我想为特定的N启用构造函数,所以我这样做:Vector(typenameboost::enable_if_c::typeconst&e0,Tconst&e1){data[0]=e0;data[1]=e1;}但是编译器(MSVC2010SP1)给我一个错误,而不是应用SFINAE。错误是:errorC2039:'typ

c++ - SFINAE 用于检测非成员模板函数的存在

TL;DR我想写一个模板函数Process(Tvalue)根据非成员函数的存在,对于不同的值表现不同CreateProcessor().我能为此做什么?我对SFINAE有疑问。假设我们需要支持函数CreateProcessor返回接口(interface)IProcessor的实现对于某些类型T.在C++中,我们不能为一个函数创建多个仅在返回类型上不同的重载,因此我们必须创建函数CreateProcessor也是由T参数化的模板函数.现在假设我们要写一个模板函数Process(Tvalue)根据CreateProcessor()的存在而不同,即它应该处理value在情况下使用处理器Cr

c++ - 基于类成员存在/不存在的 SFINAE

我对SFINAE有基本的了解,例如如何enable_if作品。我最近遇到了thisanswer,我花了一个多小时试图了解它的实际工作原理,但无济于事。这段代码的目标是根据类中是否有特定成员来重载函数。这是复制的代码,它使用C++11:templatestructModel{vectorvertices;voidtransform(Matrixm){for(auto&&vertex:vertices){vertex.pos=m*vertex.pos;modifyNormal(vertex,m,special_());}}private:structgeneral_{};structspe

c++ - 使用 clang++ 和 g++ 的 SFINAE 和 CRTP 的一些魔法

代码下面的代码给出了不同的输出,带有和不带有*注释的行:#include#includetemplateusingbool_void_t=void;templatestructis_complete:std::false_type{};templatestructis_complete>:std::true_type{};templatestructBase{staticconstexprboolvalue=is_complete{};//usingmagic=bool_void_t;//*};structFoo:Base{};intmain(){std::cout输出Thelinem

c++ - 根据模板参数添加成员函数和成员变量

我有一个函数族{f_n}其中f_0是连续的,f_1是连续可微的,$f_{n}\inC^{n}[a,b]$等等。我有一个C++类,它通过vectorv上的查找表对f_n进行数值评估templateclassf{public:f(){/*initializev*/}Realoperator()(Realx){/*findappropriateindexforx,andinterpolate*/}private:std::vectorv;};但是,如果f是可微的(n>=1),我想添加一个成员函数:templateclassf{public:f(){/*initializevanddv*/}R