从Bloch的Effective Java in C++实现类型安全的异构容器(VS2010)

Implementing typesafe heterogeneous container from Bloch's Effective Java in C++ (VS2010)

本文关键字:异构 VS2010 类型安全 实现 Effective Bloch Java in C++      更新时间:2023-10-16

我想用C++实现Bloch的Effective Java中讨论的类型安全的异构容器。该解决方案需要在VS2010中编译,但如果需要,可以使用boost。

更具体地说,我想实现一个实现以下接口的类

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;
}

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;
}

演示