2014-10-27 27 views
1

我想實現Bloch的Effective Java in C++中討論的類型安全異構容器。該解決方案需要在VS2010中編譯,但如果需要可以使用boost。從Bloch的Effective Java in C++實現類型安全的異構容器(VS2010)

更具體的我想實現實現以下接口

abstract class IHeterogenousContainer{ 

    template <typename T> virtual add(const IKey<T>& key, const T& value) = 0; 
    template <typename T> virtual T get(const IKey<T>& key) = 0; 
} 
+1

那麼問題是什麼?你可能想看看[Boost.Any](http://www.boost.org/doc/libs/release/doc/html/any.html)來存儲不同的值。 – 2014-10-27 14:03:13

+0

對不起,我希望得到如何實現上述接口的建議。 謝謝,我會看看Boost :: Any。 – daddycool 2014-10-27 14:42:17

回答

0

Boost.Any做這項工作的一類。這應該基本上做作者顯示:

#include <iostream> 
#include <string> 
#include <map> 
#include <typeindex> 

#include <boost/any.hpp> 

class heterogenous_map : 
    std::map<std::type_index, boost::any> 
{ 
public: 

    template <typename T> 
    void add(T&& value) 
    { 
     emplace(typeid(typename std::remove_reference<T>::type), std::forward<T>(value)); 
    } 

    template <typename T> 
    T  & get()  { return *boost::any_cast<T>(&at(typeid(T))); } 
    template <typename T> 
    T const& get() const { return *boost::any_cast<T>(&at(typeid(T))); } 
}; 

int main() 
{ 
    heterogenous_map map; 
    map.add(6584); 
    map.add<std::string>("Hi!"); 

    std::cout << "My favourite integer: " << map.get<int>() << '\n'; 
    std::cout << "My favourite string : " << map.get<std::string>() << std::endl; 
} 

Demo

+0

如果我理解正確,上面的代碼只能將每個類型的單個值關聯起來。如果我添加一個 – daddycool 2014-10-27 14:54:04

+0

非常感謝,我想我需要修改我的C++,才能理解上面的所有內容...... – daddycool 2014-10-27 15:00:15

+0

@daddycool:你說得對。上面的代碼確實有這個限制,但它在'std :: map MSalters 2014-10-27 15:02:16

相關問題