2011-04-19 78 views
2

成員變量的地方CONSTRUTION採取以下類:在通過構造

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萬次,我認爲這是一個浪費的努力。

我的問題是,我可以強制m_payload的就地建設,避免tempory有效載荷?我正在考慮

一個可能的解決方案是超載建設像下面很多次,但說實話與多個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

這是一個僞?您應該在發佈之前嘗試編譯代碼,或者至少應該提及這是僞代碼,因此無法編譯。 – Nawaz 2011-04-19 15:58:23

+0

這是對我正在撰寫的課程的簡化,更多用於演示目的。更正了一些丟失的括號:) – Graeme 2011-04-19 16:00:58

+0

不僅括號丟失,代碼甚至是正確的。如果你發佈這個,我們如何推斷你已經知道你的代碼多少?我看到你的代碼,你沒有模板,並沒有使用它編寫代碼的跡象。 – Nawaz 2011-04-19 16:04:20

回答

3

你在找什麼是轉發給MessageMessage::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

2

另外,還可以接受的值的參數,然後將構造它:

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

只要確保TPayload有一個正確定義和有用的移動構造函數,否則這將不會很好。

+0

+1這也適用於C++ 03,那麼你必須默認構造有效載荷成員,然後用參數「交換()」它。當然這意味着有效負載必須有一個默認的構造函數。或者至少是一個非常「便宜」的構造函數 - 即沒有太多的構造函數(不會分配內存等)。 – 2011-04-19 16:12:38

+0

@pgroke和成員必須是非const。 – 2011-04-19 16:34:01

+0

@Mark B:對。我沒有看到。應儘可能安排。 – 2011-04-19 17:43:45