将boost :: mpl :: list应用于类型的模板参数

时间:2010-12-18 02:16:37

标签: c++ boost boost-mpl boost-variant

我有一个类,需要一个包含各种类型共享指针的boost :: variant,如下所示:

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;

2 个答案:

答案 0 :(得分:5)

boost::mpl::transformboost::make_variant_over结合使用可以解决问题:

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

答案 1 :(得分:0)

看看boost::make_variant_over它能满足您的需求。