参加以下课程:
template <typename TPayload>
class Message
{
public:
Message(const TPayload& payload)
: m_header(sizeof(TPayload)),
m_payload(payload) {}
private:
const Header m_header;
const TPayload m_payload;
};
每当我构造一个Message时,我必须创建一个TPayload(参数payload),将其复制到m_payload中,然后破坏有效负载。现在考虑这可以每秒完成100'000次,我认为这是一种浪费的努力。
我的问题是,我是否可以强制建立m_payload来避免临时负载?
我正在考虑的一个可能的解决方案是如下所示多次重载结构,但老实说,对于多个argumwents的所有复制,我怀疑有很多节省。
template <typename TPayload>
class Message
{
public:
template <typename A>
Message(const A& a)
: m_header(sizeof(TPayload)),
m_payload(a) {}
template <typename A, typename B>
Message(const A& a, const B& b)
: m_header(sizeof(TPayload)),
m_payload(a, b) {}
private:
const Header m_header;
const TPayload m_payload;
};
答案 0 :(得分:3)
您正在寻找的是将<{1}}的构造函数参数转发到Message
的构造函数。
这可以在C ++ 11中完整地完成(使用可变参数模板和Message::m_payload
,在std::forward
和许多其他函数中使用)或在C ++ 03中使用多个重载,当你开始写作,并使用std::vector<>::emplace_back()
例如:
in boost::make_shared<>
答案 1 :(得分:2)
同样在C ++ 11中,您可以按值接受参数,然后移动构造它:
Message(TPayload payload)
:m_header(sizeof(TPayload)),
m_payload(std::move(payload)) {}
确保TPayload具有正确定义且有用的移动构造函数,否则这不会有太大作用。