草庐IT

TypeName

全部标签

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++ - 对不带参数的可变参数模板函数的调用不明确?

运行时:templatestructCodeByType{staticconstint32_tValue=7;};templatestructCodeByType{staticconstint32_tValue=1;};templateint32_tSum(){//ThecompilercomplainsonthislinereturnSum()+Sum();}templateint32_tSum(){returnCodeByType::Value;}intmain(){autosum=Sum();}我得到:ErrorC2668'Sum':ambiguouscalltooverload

c++ - C++ 11 中具有多个模板参数的模板函数的特化

无法弄清楚为什么我会收到以下代码的编译器错误:#includetypedefTCHARChar;typedefstd::basic_stringString;templatestd::basic_stringInternalToString(Tval);templateinlinestd::stringInternalToString(Tval){returnstd::to_string(val);}templateinlinestd::wstringInternalToString(Tval){returnstd::to_wstring(val);}templateinlineStr

C++ typelist make 子列表

假设我有一个类型templatestructtypelist{};我需要从此列表中获取子列表:templatestructsublist{usingtype=?;//};例如sublist::type==typelist当start=0我有一个有效的tail实现:templatestructtypelist{};templatestructtail{usingtype=typenametail::type;};templatestructtail{usingtype=typelist;};usingT=tail::type;#include#includeintmain(){::pri

C++ 模板成员特化——这是编译器限制吗?

有没有可能做这种特化?如果是,怎么办?有问题的专业被标记为//THISSPECIALIZATIONWILLNOTCOMPILE我用过VS2008,VS2010,gcc4.4.3都编译不了。我知道我可以通过重载func来避免这种情况,但我想知道是否有一种方法可以通过模板特化来做到这一点。(尽管可能不切实际/不可取)#include#includeusingnamespacestd;templateclassklass{public:templatevoidfunc(BETAB);};templatetemplatevoidklass::func(BETAB){couttemplatevo

c++ - 如何在不创建空类的情况下避免专门化 "big"模板类?

鉴于以下情况:templateclassTuple{private:T0v0;T1v1;T2v2;T3v3;T4v4;public:voidf(){cout我想创建一个只有两个int的部分类-s,那么我必须像这样专门化:classNullType{};//createanemptyclasstemplateclassTuple{private:T0v0;T1v1;public:voidfunc(){cout但是这个实现需要我做:Tupleb;所以这很丑:)是否有另一种方法可以在不定义另一个(空)类的情况下实现部分特化,这样我就可以做到:Tupleb1;? 最

c++ - 使用 std::enable_if 和可变参数基类

这是我正在尝试做的一个简化示例:#include#include#includetemplateclassfoo{public:templatetypenamestd::enable_if::value>::typebar(constU&t){std::coutclassbaz:publicfoo...{};intmain(){bazb;b.bar(1.0);}这给了我模棱两可的函数错误:error:requestformember'bar'isambiguousb.bar(1.0);note:candidatesare:templatetypenamestd::enable_if::

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

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

c++ - 使用 std::enable_if 有什么问题?

我有一个函数set_data,我必须针对它接收的不同类型以不同的方式实现它。例如,它试图根据输入类型实现两个重载。如果是基本的,非void和非nullptr_t,则在第一次实现时处理它。如果它是std::string或char缓冲区,则以第二种方式处理它。structfield{templatevoidset_data(TDataTypedata,size_tindex=0);};template::value&&std::is_same::value==false&&std::is_same::value==false>::type>voidfield::set_data(TData

c++ - 如何处理 void decltype();

我想创建一个模板来调用另一个对象的成员函数,该对象返回与成员函数相同的类型。在成员函数上使用decltype的语法有点难看,但它似乎适用于除一种情况之外的所有情况。调用如下:structcontainer:map{templateautosafeOperation(stringkey,MemFnPtrTypemfp,_ArgTypes&&...args)->decltype((((C*)nullptr)->*mfp)(args...)){C*pC=NULL;decltype((pC->*mfp)(args...))result;iteratorit=find(key);if(it!=e