2013-07-01 51 views
1

我想有模板元素的容器,但它不是編譯,因爲第一個參數沒有給出我怎麼能有模板元素的容器

所以我想把下面的類在一個std ::地圖

template <typename T> 
    class TemplateParam 
    { 
    ITemplateParam<T> param_; 
    public: 
    TemplateParam(T value) 
    { 
     if (sizeof(value) >= sizeof(void*)) 
     param_ = ptrTemplateParam<T>(value); 
     else 
     param_ = cpyTemplateParam<T>(value); 
    } 
    const T &getParam() const { return param_.getParam(); } 
    }; 

ITemplateParam

template <typename U> 
    class ITemplateParam 
    { 
    public: 
    virtual ~ITemplateParam(){} 
    virtual const U& getParam() const = 0; 
    }; 

我想我明白爲什麼我不能在容器中放入不同尺寸的元素,這就是爲什麼我使用ptrTemplateParamcpyTemplateParam。 (我也試圖與shared_ptr的)

你有什麼想法,我怎麼能解決我的問題

我可以使用Boost庫

我已經看過這個link,但我不知道如何我可以宣佈吸氣劑嗎?

編輯:

感謝您的回答,我能夠將其存儲在一張地圖,但我不能夠插入地圖中的一個元素,我必須用void *

所以我有改變了我的類:

class ITemplateParam 
    { 
    public: 
    virtual ~ITemplateParam(){} 
    virtual const void *getParam() const = 0; 
    }; 

    template <typename U> 
    class ptrTemplateParam : public ITemplateParam 
    { 
    U param_; 
    public: 
    ptrTemplateParam(U & param) : param_(param) {} 
    virtual const void *getParam() const { return param_; } 
    }; 

    class TemplateParam 
    { 
    std::shared_ptr<ITemplateParam>  param_; 
    public: 
    template <typename T> 
    TemplateParam(T value): param_(ptrTemplateParam<T>(value)) 
    { 
    } 

    const void *getParam() const { return param_->getParam();} 
    }; 

,我嘗試做

std::map<std::string, TemplateParam> m_; 
m_["integer"] = TemplateParam(5); 

編輯2 boost :: any是解決方案

回答

3

如果您需要有一個包含不同類型的元素的容器,那麼你必須 基本上3種方式:

  1. 也有變種或工會的容器。
  2. 擁有多態指針或多態智能指針的容器。
  3. 使用侵入性容器。

從你的問題中不清楚什麼對你最好。

+0

可能作者只是不需要使用異構容器。它們比通常的更慢,更復雜。 – eraxillan

+1

@Axilles是的,但他的發佈代碼看起來像他試圖使'std :: map '或其他東西關閉。 –

+0

因此,他試圖重新發明輪子,即boost :: any。好。 但我不喜歡這件事情,因爲它很複雜,可能不快,可能會導致各種錯誤。儘管如此,這只是我的看法。 – eraxillan

2

恕我直言,如果你想把不同的項目放在同一個容器中,你應該考慮使用Boost.Variant。這不是對您實際示例的直接回答,但我發現這種模式對於這類問題非常有用。您避免使用指針並以優雅的方式強制繼承。

class A {}; 
class B {}; 

typedef boost::variant<A, B> item_t; 
... 
vector<item_t> my_container;