如何转换boost :: fusion :: vector的类型?

时间:2018-06-05 18:49:05

标签: c++ boost boost-fusion

我需要为指定的typelist定义两种类型:第一种是这些类型的boost::fusion::vector,第二种是boost::fusion::vector,其中对于类型列表中的每种类型都删除了引用和const

例如,我有intunsigned &long const &。我需要定义boost::fusion::vector<int, unsigned &, long const &>boost::fusion::vector<int, unsigned, long>

这是我的代码:

struct RemoveRef
{
    template <class T>
    struct apply
    {
        using type =
            typename std::remove_const<typename std::remove_reference<T>::type>::type;
    };
};

template <typename...Args>
struct BasicDefinition
{
    typedef typename boost::mpl::vector<Args...> Types;
    typedef typename boost::fusion::result_of::as_vector<Types>::type ArgsType;
    typedef typename boost::mpl::transform<Types, RemoveRef>::type ValueTypes;
    typedef typename boost::fusion::result_of::as_vector<ValueTypes>::type ArgValuesType;
};

有效。我将这些类型设为BasicDefinition<>::ArgsTypeBasicDefinition<>::ArgValuesType。但是我想摆脱boost::mpl::vector并直接从第一个类型构建第二个类型。有可能实现这样的结果吗?

类似的东西:

template <typename...Args>
struct BasicDefinition
{
    typedef typename boost::fusion::vector<Args...> ArgsType;
    typedef ?????<ArgsTypes, RemoveRef>::type ArgValuesType;
};

1 个答案:

答案 0 :(得分:0)

您可以使用std::decay_t

template <typename...Args>
struct BasicDefinition
{
    using ArgsType = boost::fusion::vector<Args...>;
    using ArgValuesType = boost::fusion::vector<std::decay_t<Args>...>;
};