简单的论证转发(我的签名应该是什么?)

use*_*130 1 c++ arguments weak-ptr

举个例子,假设我正在为vector的push_back方法编写一个瘦包装器.

class Foo
{
public:
   void myPushBack(Bar b);   // Line in question
private:
   std::vector<Bar> vec;
}

void Foo::MyPushBack(bar b)
{
   vec.push_back(bar);
}

main()
{
   Foo f();
   f.myPushBack();
}
Run Code Online (Sandbox Code Playgroud)

我的问题是该函数的正确签名是什么myPushBack?然后我的下一个问题是,myPushBack如果vec类型是什么,该函数的正确签名是什么std::vector<weak_ptr<Bar>>

rod*_*igo 6

假设您使用的是C++ 11,您应该使用完美的转发习惯用法:

template<typename T> void Foo::MyPushBack(T &&b)
{
   vec.push_back(std::forward<T>(b));
}
Run Code Online (Sandbox Code Playgroud)

由于它是一个模板,因此矢量的实际类型无关紧要.它甚至会考虑隐式转换,比如const char*std::string.