通过构造函数构造成员变量

时间:2011-04-19 15:48:32

标签: c++ construction in-place

参加以下课程:

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;
};

2 个答案:

答案 0 :(得分:3)

您正在寻找的是将<{1}}的构造函数参数转发Message的构造函数。

这可以在C ++ 11中完整地完成(使用可变参数模板和Message::m_payload,在std::forward和许多其他函数中使用)或在C ++ 03中使用多个重载,当你开始写作,并使用std::vector<>::emplace_back()

例如:

in boost::make_shared<>

测试运行:https://ideone.com/J1JnZ

答案 1 :(得分:2)

同样在C ++ 11中,您可以按值接受参数,然后移动构造它:

Message(TPayload payload)
    :m_header(sizeof(TPayload)),
     m_payload(std::move(payload)) {}

确保TPayload具有正确定义且有用的移动构造函数,否则这不会有太大作用。