2012-10-22 136 views
4

我要做到以下幾點:傳遞可變數量的參數的構造函數

Entity e; 
e.AddComponent<CPosition>(128, 128); //method should instantiate a new CPosition(128,128) 
e.AddComponent<CSprite>(some, other, args); //etc 

的重要組成部分,是AddComponent方法。它應該試圖通過傳遞參數來構造泛型類型。我相信C++ 11的可變參數模板可以將參數轉發給構造函數。但是,我還沒有訪問此功能(VS2010)。

有沒有人有任何想法如何做到這一點?

+3

如果您不能使用可變參數模板,總有普通的老式非類型安全的可變參數的功能並通過從內部列表那。 – chris

+0

我實際上正在嘗試做類似的事情,將Direct3D紋理和表面合併爲一個我正在寫的引擎的類。既然我也想要一個答案,先生,這是一個投票。 –

+0

如果您只希望使用少量的模板類型,則可以始終專注於模板功能。 –

回答

6

寫一堆重載,每個重載參數的數量不同。

class Entity 
{ 
public: 
template<typename T> 
void AddComponent() { component_ = new T(); } 

template<typename T, typename T1> 
void AddComponent(T1 t1) { component_ = new T(t1); } 

template<typename T, typename T1, typename T2> 
void AddComponent(T1 t1, T2 t2) { component_ = new T(t1, t2); } 

// etc 
... 
}; 
+2

您應該使用'&&'和模板參數推導,以便您可以正確地轉發參數。 –

+1

OP說他們使用VS2010,它不支持C++ 11。 (畢竟,如果是這樣,那麼他們可能剛剛使用了可變參數模板。) –

+1

它不支持可變參數模板,但它確實支持使用完美轉發的R值參考。沒有可變的部分。 –

3

檢查矢量:: emplace_back如何提高::容器::實現: http://www.boost.org/doc/libs/1_51_0/boost/container/vector.hpp

它採用Boost.Preprocessor用於自動生成取不同數量的參數的函數。它生成一些預定義的函數。

因此,您不必手動編寫每個過載。相反,你可以只寫一次你的模式。

例如:

#include <boost/preprocessor/iteration/local.hpp> 
#include <boost/preprocessor/repetition/enum.hpp> 
#include <boost/preprocessor/repetition/enum_trailing_params.hpp> 

struct Entity 
{ 
#define ENTITY_PP_PARAM_LIST(z, n, data) const BOOST_PP_CAT(P, n) & BOOST_PP_CAT(p, n) 
#define ENTITY_PP_PARAM_PASS(z, n, data) BOOST_PP_CAT(p, n) 

#define BOOST_PP_LOCAL_MACRO(n) \ 
    template<typename GenericType BOOST_PP_ENUM_TRAILING_PARAMS(n, typename P) > \ 
    void AddComponent(BOOST_PP_ENUM(n, ENTITY_PP_PARAM_LIST, _)) \ 
    { \ 
     something=new GenericType(BOOST_PP_ENUM(n, ENTITY_PP_PARAM_PASS, _)); \ 
    } \ 
    /**/ 

#define BOOST_PP_LOCAL_LIMITS (0, 3) 
#include BOOST_PP_LOCAL_ITERATE() 
}; 

預處理擴展至後:

struct Entity 
{ 
    template<typename GenericType > 
    void AddComponent() 
    { 
     something=new GenericType(); 
    } 

    template<typename GenericType , typename P0 > 
    void AddComponent(const P0 & p0) 
    { 
     something=new GenericType(p0); 
    } 

    template<typename GenericType , typename P0 , typename P1 > 
    void AddComponent(const P0 & p0 , const P1 & p1) 
    { 
     something=new GenericType(p0 , p1); 
    } 

    template<typename GenericType , typename P0 , typename P1 , typename P2 > 
    void AddComponent(const P0 & p0 , const P1 & p1 , const P2 & p2) 
    { 
     something=new GenericType(p0 , p1 , p2); 
    } 
}; 
+0

這看起來像Boost PP庫的一個很好的用法,與Raymond Chen的迴應一起,看起來我有我的答案。 –

相關問題