参加以下类(class):
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 就地构造以避免临时有效负载吗?
我正在考虑的一个可能的解决方案是多次重载构造,如下所示,但说实话,对于多个参数的所有复制,我怀疑是否可以节省很多。
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();
}
关于c++ - 通过构造函数就地构造成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5719093/