草庐IT

完美转发

全部标签

c++ - 重载 -> 运营商通过代理转发成员访问

我正在尝试包装PythonPyObject*在Object类(class)。在Python中,一切都是PyObject*.列表是PyObject*,列表中的每一项本身就是一个PyObject*.这甚至可以是另一个列表。等我正在尝试允许fooList[42]=barObj通过代理模式(here)的样式语法。现在我已经可以正常工作了,我想扩展它以便fooList[42]可以用作Object.具体来说,我希望能够处理...fooList[42].myObjMethod()fooList[42].myObjMember=...Object有很多方法,目前fooList[42].myObjMet

c++ - 为什么在完美转发中不允许隐式转换?

假设我们有以下代码:voidff(wchar_t*){}templatevoidffc(T&&a){ff(std::forward(a));}为什么允许调用ff(0),但不允许调用ffc(0)? 最佳答案 在ffc(0)的情况下T将被推断为int,因为0是一个整数文字,其类型为int并且即使没有转发,也没有从int到wchar_t*的有效隐式转换,因此以下情况也不会起作用:templatevoidffc_no_forward(T&&a){ff(a);}而在第一种情况下0是空指针常量,因此完全有效地转换为wchar_t*。从C++14

c++ - 非模板类方法的完美转发

完美转发通常出现在模板类的上下文中。对于非模板类,是否值得制作例如构造函数是一个模板方法,因此它可以使用完美转发?类似下面的内容:classFoo(){public:templateFoo(T&&vec):memberVec(std::forward(vec)){};private:std::vectormemberVec;};优点基本相同,但是当我们知道真正的类类型时,有什么不同吗?这什么时候是好的做法,什么时候不是? 最佳答案 非显式单参数构造函数是转换构造函数。除非Foo应该是可转换的vector(这可能是真的),你应该把它变

c++ - 寻找完美四叉树的大小

我需要找到完美四叉树的大小。这意味着我有1个根节点split成4个节点,split成4个节点等。所以高度为1的四叉树的大小为1高度2=尺寸5(1+4)高度3=尺寸21(1+4+16)高度4=尺寸85(1+4+16+64)等..我知道完美二叉树的大小可以通过以下公式找到:size=2^(height+1)-1所以我相信四叉树也存在类似的等式。那是什么? 最佳答案 这是一个geometricseries.所以相关的公式是:S=a*(1-r^n)/(1-r)其中a是第一个值,r是公比,n是项数,^表示“to-the-power-of”。

c++ - 当左值引用参数和右值引用参数作为相同的转发引用类型传递时,为什么它不起作用?

#includetemplatevoidf(T&&a,T&&b){}intmain(){intn;f(n,std::move(n));}T&&是转发引用类型,所以我觉得decltype(a)应该是int&和decltype(b)应该是int&&。但是,上面的代码会产生以下错误:main.cpp(13,2):error:nomatchingfunctionforcallto'f'f(n,std::move(n));main.cpp(7,6):note:candidatetemplateignored:deducedconflictingtypesforparameter'T'('int&

c++ - 无 ODR 使用的完美转发

考虑以下代码片段,就像写在头文件中一样:structFoo{//...};templateFoomakeFoo(Args&&...args){return{std::forward(args)...};}我可以用一些参数调用makeFoo,然后返回一个Foo。太好了。现在我要做的是用标签替换一些makeFoo的参数,看起来就像这样(仍在头文件中):constexprstructtag_type{usingtype=ActualType;}tag;应该在makeFoo中检测到这些标签,并在调用Foo的构造函数之前替换实际对象。所以调用看起来像:automyFoo=makeFoo("hi"

c++ - 如何转发声明 boost::ptree::iterator

我想在我的项目中使用boostptree,但由于ptree.hpp导致包含另外1000个头文件,这大大增加了编译时间(例如从1秒到7秒),并且因为它在20多个不同的cpp文件中需要这是NotAcceptable(预编译的header不会改善太多)。所以我正在考虑将boostptree封装在我自己的类中,比如//myptree.h#includeclassmyptree{private:boost::property_tree::ptree*m_tree;public:...//addingnew(singlevalue)memberstothethetreevoidput(consts

c++ - 修改参数的函数的完美返回

对模板函数中的完美转发进行了广泛的讨论,以允许将左值或右值参数作为参数有效地传递给其他函数。但是,我找不到关于完美返回或等价的完美传递的讨论。(相关问题Perfectpass-through没有完全解决这个问题。)考虑一个函数修改范围并且应该返回修改后的范围的情况。我们需要两个单独的函数来有效地处理左值和右值参数的情况://Givenareferencetoanlvaluerange,returnareferencetothesamemodifiedrange.//(Thereisnoallocationormove.)templateT&sortr(T&r){std::sort(st

c++ - 将可变参数模板参数转发给多个类成员

以下安全吗?不会std::string是moved在第一类成员初始化之后?打印出来没问题,但我不确定。templateclassTest{public:templateTest(Args&&...args):m_one(newT(std::forward(args)...)),m_two(newT(std::forward(args)...))//m_one;std::unique_ptrm_two;};classC{public:C(inta,intb,conststd::string&c):m_a(a),m_b(b),m_c(c){std::coutt(1,2,"3");}我想这没

c++ - 使用 std::function 或转发引用作为高阶函数的通用可调用对象输入参数?

我想知道编写一个以std::function作为输入参数的高阶函数的主要区别、优缺点。或转发引用,例如templatevoidhof(F&&fun);.显然,前者比后者更严格,因为它指定了输入可调用对象必须符合的函数类型。 最佳答案 std::function通常具有显着的运行时开销。通过template参数传递通用可调用对象可避免std::function的间接成本,并允许编译器积极优化。我在theendofthisarticle为lambda递归编写了一些简单的基准测试(Y组合器与std::function).std::func