许多容器类模板有一个以计数和样本元素作为参数的构造函数,以及另一个以一对输入迭代器为参数的构造函数。insert等其他方法表现出相同的模式。当模板用整数类型实例化时,天真的实现会遇到麻烦,并且用一对整数调用构造函数(或其他方法):它们的类型相等,输入迭代器方法将给出有效的参数类型推导,但随后无法编译。我正在寻找一种优雅的方式来指定输入迭代器方法仅参与实际有效输入迭代器类型的(相等)参数类型的重载,或者至少不参与整数类型。我的印象是SFINAE是要走的路(但很高兴被告知不同),但是在阅读它时,坦率地说我不太了解规则,而且示例中提供的解决方案很难算得上优雅.作为附带限制,我希望我的代码能够
我有这段代码,其中一个函数根据可用的成员有不同的实现:#includetemplatestructD{structinner{Tfirst;};};templatestructD{usinginner=std::vector;};templateclassC{usingB=D;typenameB::innerb;public:typenamestd::enable_if().first),T>::value,T>::typefirst(){returnb.first;}typenamestd::enable_if()[0]),T>::value,T>::typefirst(){retu
如何检查某些类型是否可从其他类型显式(或反之亦然)构造?在这种情况下是否有任何SFINAE技巧?我可以将is_explicitly_constructible写成combinationofstd::is_constructibleandstd::is_convertible:#includetemplatestructis_explicitly_constructible:std::bool_constant::value&&!std::is_convertible::value>{};但是我是否考虑了此类代码中所有可能的情况? 最佳答案
我怎样才能像这样检查模板函数的存在:检查reader结构是否有read算术值structreader{templatestd::enable_if_t::value,T>read(){return{};}};我使用这样的检查器:templatestructtest_read{staticconstexprautovalue=std::is_convertible().read()),int>::value;};但是编译器提示:error:wrongnumberoftemplatearguments(1,shouldbe2)staticconstexprautovalue=std::is
判断一个函数是否存在一个函数,可以使用如下:templateusingvoid_t=void;voidfn(int);structX{};template()))>>voidfn2(T){}voidtest(){fn2(int(1));//works//fn2(X());//doesn'twork}现在,有没有办法检测fn(T)是否不存在T类型?例子:voidtest2(){//fn2(int(1));//doesn'tworkfn2(X());//works}这样做的原因是要定义一个排除操作,这样我就可以为两者定义fn2()以避免歧义错误。 最佳答案
#includeusingnamespacestd;templateclasstest{public:Tvalue;templatetest(Args...args):value(args...){couttest(Args...):value(1){couth;}我正在尝试为创建的对象(h)调用第二个constructor。我不知道为什么会出现此错误:prog.cc:Infunction'intmain()':prog.cc:45:13:error:callofoverloaded'test()'isambiguoustesth;^prog.cc:25:5:note:candidat
考虑以下示例(https://godbolt.org/z/pSTUZI):#include#includetemplatestructfalsy:std::false_type{};template::value,int>::type=0>voidf(std::back_insert_iterator){}templatevoidf(T){}structS{};intmain(){Ss;f(s);}用gcc8.3或更早版本编译会报错:Infileincludedfrom/opt/compiler-explorer/gcc-8.3.0/include/c++/8.3.0/iterator
我想在定义特定类型时选择模板的特化。我仍然不能全神贯注于SFINAE:(。我可能很接近,也可能完全偏离。我尝试了不同的东西,这是一些东西,我至少希望理解为什么它不起作用(is_complete基本上是从here偷来的):#include#includetemplatestructis_complete:std::false_type{};templatestructis_complete:std::true_type{};//thisshouldbecallediffooisnotdefinedvoidtest(){std::coutstd::enable_if::value,void
我最近开始使用右值引用,但我遇到了一个案例,我不明白为什么它们会这样工作。我正在尝试确定一个类型是否可以调用begin和end。如果我更改foo以按值或const引用获取它的参数,下面的代码会给出预期的结果,但我不确定为什么在使用右值引用时它不起作用,我想知道是否谁能告诉我为什么。#include#include#includetemplateautobegin(Container&&c)->decltype(c.begin()){returnc.begin();}templateautoend(Container&&c)->decltype(c.end()){returnc.end(
#includeusingnamespacestd;structasd{voidf();};intf();typedeftypenameresult_of::typeresult_free;typedeftypenameresult_of::typeresult_mem;两个typedef都报错Infileincludedfrom../main.cpp:1:0:/usr/include/c++/4.6/type_traits:Ininstantiationof‘std::_Result_of_impl’:/usr/include/c++/4.6/type_traits:1215:12: