草庐IT

转发表

全部标签

c++ - 完美转发可变参数模板到标准线程

我正在尝试制作一种std::thread形式,它在线程中执行的代码周围放置一个包装器。不幸的是,由于我对右值和Function的理解不足,我无法编译它。我试图传递的模板化类型。这是我的代码:#include#include#includevoidSimple2(inta,intb){}templatevoidWrapper(Function&&f,Args&&...a){f(std::forward(a)...);}classPool{public:templatevoidBinder(Function&&f,Args&&...a){std::threadt(Wrapper,std::

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++ - 当左值引用参数和右值引用参数作为相同的转发引用类型传递时,为什么它不起作用?

#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++ - 将可变参数模板参数转发给多个类成员

以下安全吗?不会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

c++ - 为什么转发引用需要 std::forward

这个问题在这里已经有了答案:Whatarethemainpurposesofstd::forwardandwhichproblemsdoesitsolve?(7个答案)关闭5年前。在这样的函数模板中templatevoidfoo(T&&x){bar(std::forward(x));}不是xfoo中的右值引用,如果foo用右值引用调用?如果使用左值引用调用foo,则无论如何都不需要强制转换,因为x也将是foo内部的左值引用.还有T将被推导为左值引用类型,因此std::forward不会改变x的类型.我使用boost::typeindex进行了测试使用和不使用std::forward时,