And*_*ndt 2 c++ boost boost-variant boost-mpl
我有一个类需要一个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...
}
Run Code Online (Sandbox Code Playgroud)
该类目前需要以下表单的模板参数进行编译:
ToyPicker<
boost::variant<
boost::shared_ptr<ToyModel>
>,
boost::variant<
boost::shared_ptr<BlueToy>,
boost::shared_ptr<RedToy>,
boost::shared_ptr<GreenToy>
>
> toyPicker;
Run Code Online (Sandbox Code Playgroud)
如何使用mpl列表以便我可以为用户提供以下更简单的定义,然后将其转换为上面类实现中的示例格式?
ToyPicker<
boost::mpl::list<
ToyModel
>,
boost::mpl::list<
BlueToy,
RedToy,
GreenToy
>
> toyPicker;
Run Code Online (Sandbox Code Playgroud)
将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;
};
Run Code Online (Sandbox Code Playgroud)