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

参加以下课程:
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;
};
每当构造消息时,都必须创建TPayload(参数有效负载),将其复制到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;
};
    
已邀请:
您正在寻找的是将提供给
Message
的构造函数参数转发给
Message::m_payload
的构造函数。 这可以在C ++ 11中完成(使用可变参数模板和
std::forward
,如
std::vector<>::emplace_back()
和许多其他函数中所用),也可以在C ++ 03中重载,如您开始编写时所用,以及如
in boost::make_shared<>
所用 例如:
#include <iostream>
#include <string>
#include <utility>
typedef size_t Header;
template <typename TPayload>
class Message
{
    public:
        template <typename ...Args>
        Message(Args&&... args)
             : m_header(sizeof(TPayload)),
               m_payload(std::forward<Args>(args)...)
               {}
        void show_payload() const
        {
                std::cout << m_payload << \'\\n\';
        }
    private:
        const Header   m_header;
        const TPayload m_payload;
};

int main()
{
     Message<std::string> test(10, \'a\');
     test.show_payload();

     Message<double> test2(3.14);
     test2.show_payload();
}
试运行:https://ideone.com/J1JnZ     
同样在C ++ 11中,您可以按值接受参数,然后移动构造它:
Message(TPayload payload)
    :m_header(sizeof(TPayload)),
     m_payload(std::move(payload)) {}
只要确保TPayload具有正确定义和有用的move构造函数,否则就不会做很多事情。     

要回复问题请先登录注册