2010-12-18 69 views
2

我有需要共享包含指针的各种类型如下一个boost ::变种的类:应用一个boost :: MPL ::列表类型的模板参数

template <typename ToySharedPtrVariant, typename ColorSharedPtrVariant> 
class ToyPicker { 
    typedef std::pair< 
    ToySharedPtrVariant, 
    ColorSharedPtrVariant 
    > toyAndColorPair; 
    typedef std::map< 
    std::string, 
    std::vector< 
     toyAndColoPair 
    > 
    > stringToToyColorPairMap; 

    // ... methods that use the defined types... 
} 

该类目前需要以下形式的模板参数进行编译:

ToyPicker< 
      boost::variant< 
      boost::shared_ptr<ToyModel> 
      >, 
      boost::variant< 
      boost::shared_ptr<BlueToy>, 
      boost::shared_ptr<RedToy>, 
      boost::shared_ptr<GreenToy> 
      > 
     > toyPicker; 

如何使用MPL列表,以便我可以允许用户进行以下的简单得多的定义,然后将其转换成例如格式我上面的类实现里面?

ToyPicker< 
     boost::mpl::list< 
     ToyModel 
     >, 
     boost::mpl::list< 
     BlueToy, 
     RedToy, 
     GreenToy 
     > 
    > toyPicker; 

回答

4

boost::make_variant_over结合使用boost::mpl::transform的伎俩:

#include <boost/mpl/list.hpp> 
#include <boost/mpl/transform.hpp> 
#include <boost/shared_ptr.hpp> 
#include <boost/variant/variant.hpp> 

template<class T> 
struct add_shared_pointer 
{ 
    typedef boost::shared_ptr<T> type; 
}; 

template<class Seq> 
struct shared_ptr_variant 
{ 
    typedef typename boost::make_variant_over< 
      typename boost::mpl::transform< 
       Seq, add_shared_pointer<boost::mpl::_1> 
      >::type 
     >::type type; 
}; 
0

看看boost::make_variant_over它做你所需要的。

+0

的boost :: make_variant_over将创建一个变种,不在变,shared_ptr的 ...> – 2010-12-18 07:28:23

+0

权,荣誉给icecrime为比我更彻底:) – andreabedini 2010-12-19 01:38:49