使用自由函数作为伪构造函数以避免显式指定模板参数是否是一种常见的模式/习惯用法?比如大家都知道std::make_pair,它使用它的参数来推断pair类型:templatestd::pairmake_pair(Aa,Bb){returnstd::pair(a,b);}//Thisallowsyoutocallmake_pair(1,2),//insteadofhavingtotypepair(1,2)//asyoucan'tgettypedeductionfromtheconstructor.STL在中也大量使用了它(bind1st、not1、ptr_fun等...)我发现自己经常使
templatevoidprint_size(constT&x){std::cout这在最近的g++编译器上打印115。显然,T被推导为数组(而不是指针)。标准是否保证了这种行为?我有点惊讶,因为下面的代码打印了指针的大小,我认为auto的行为与模板参数推导完全一样?intmain(){autox="IfyoutimidlyapproachC++asjustabetterCorasanobject-orientedlanguage,youaregoingtomissthepoint.";print_size(x);//prints4} 最佳答案
有没有办法判断函数返回的是常量值还是非常量值?decltype适用于引用,但不适用于非引用类型。#includetemplatestructprint_type;//undefinedintmain(){autolambda=[]()->constint{return0;};print_typedt;//print_typeprint_type::type>ro;//print_typereturn0;}我实现了一个std::tuple转换函数,它将在每个元组元素上调用一个函数对象,并将结果存储在一个由返回类型组成的新tuple中。这不适用于const返回类型,这非常令人惊讶(但需要)
我目前正在考虑如何最好地将模板的泛型类型限制为std::sting以及字符串文字。因此,我使用std::is_same将推导类型与所需类型进行比较。在std::string的情况下,这会立即起作用。对于字符串文字,即charconst数组,它仅在我对类型使用std::decay然后将结果与类型charconst*进行比较时才有效。如果我直接将推导的类型与我认为应该是的类型进行比较,is_same将返回false,如以下示例代码所示。templatevoidfunction(TYPE&¶meter){//thisdoesn'tworkasexpectedstd::cout::va
考虑这样一种情况,函数模板需要转发一个参数,同时保持它的左值性,以防它是一个非常量左值,但它本身对参数实际是什么是不可知的,如:templatevoidtarget(T&){coutvoidtarget(constT&){coutvoidforward(T&x){target(x);}当x是一个右值时,而不是T被推导为常量类型,它给出了一个错误:intx=0;constinty=0;forward(x);//T=intforward(y);//T=constintforward(0);//Hopefully,T=constint,butactuallyanerrorforward(0)
我正在尝试调整Avoidingstructinvariadictemplatefunction中提供的解决方案根据我的需要。但是,我无法理解G++的行为。考虑以下功能:templateintnextline(consttypenamestd::arrayar){return0;}然后调用nextline(std::array{1,0});与GCC提示不匹配eslong.cpp:Infunction‘intmain()’:eslong.cpp:10:38:error:nomatchingfunctionforcallto‘nextline(std::array)’nextline(std
我有一个关于函数模板参数类型推导过程的问题。举个例子:#include#include#include#include#includeintmain(){std::ifstreamfile("path/to/file");std::vectorvec(std::istream_iterator{file},{});//如果我理解正确,第二个参数被推断为std::istream_iterator类型其中调用了默认构造函数。适当std::vector构造函数声明为:templatevector(InputIteratorfirst,InputIteratorlast,constalloca
在他的CppCon2014演讲中"TypeDeductionandWhyYouCare",ScottMeyers提出了一个问题,为什么在C++11/C++14标准中有关于auto和大括号初始化器的特殊规则(他的问题从at36m05s开始)。auto与braced-init-list组合的语义在§7.1.6.4/6中定义。我想了想,也想不出一个用例。到目前为止,我所看到的最接近的例子是BjarneStroustrup使用它的一个例子。在他的Cpp2014talk"MakeSimpleTasksSimple!",他曾经使用auto来捕获初始化器(但只是作为一种变通方法)。这是代码(幻灯片3
我有一个继承自基类模板的类模板。基类模板有一个数据成员和一个我想从父类(superclass)中调用的成员函数模板。我知道为了消除对成员函数模板的调用的歧义,我必须使用template关键字,我必须明确提及this在父类(superclass)中。this->base_member_obj.templatemember_function();这一切都很好,只是我使用的代码库犯了一个相当不幸的错误,即导入了整个namespacestd。,我试图调用的模板成员函数称为set.框架中的某处std::set包含在内,这导致GCC认为我正在尝试声明std::set而不是调用成员函数set.GCC
假设我有以下类(class):templateFoo{...};模板参数具有不同的映射,因此我可以根据T是什么推导出其他模板参数U和V。例如,如果T是double,则U和V将始终是某些类D1和D2,如果T是float,则U和V将始终是其他类F1和F2。考虑到这一点,有没有一种方法可以只传入一个模板参数,并让编译器推导出其他两个参数?我知道简单的答案是让这些其他类也模板化并将模板参数T传递给它们,但我无法使这些类模板化(它们是由工具自动生成的)。理想情况下,我可以像这样使用typedef或#define:typedefFooFootypedefFooFoo但是这些不编译。我想知道是否有一