Применение boost::mpl::list к параметру шаблона типа

У меня есть класс, для которого требуется 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;

person Andrew Hundt    schedule 18.12.2010    source источник


Ответы (2)


Использование boost::mpl::transform в сочетании с boost::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;
};
person icecrime    schedule 18.12.2010

Посмотрите на boost::make_variant_over, что он делает тебе нужно.

person andreabedini    schedule 18.12.2010
comment
boost::make_variant_over создаст вариант‹T1,T2...›, а не вариант‹shared_ptr‹T1›, shared_ptr‹T2›... › - person Andrew Hundt; 18.12.2010
comment
хорошо, слава icecrime за то, что они намного тщательнее меня :) - person andreabedini; 19.12.2010