2

次のように、さまざまな型への共有ポインターを含む 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;
4

2 に答える 2

5

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;
};
于 2010-12-18T09:40:35.220 に答える
0

Look at boost::make_variant_over it does what you need.

于 2010-12-18T03:15:35.067 に答える