在可变参数模板上的变换算法

时间:2015-06-16 09:11:50

标签: c++ templates c++11 variadic-templates template-meta-programming

我正在使用C ++ 11,我需要像变换(容器的stl算法)之类的东西,它可以转换template<typename ...T&gt;进入<typename ...T::something>所以我可以用它来继承:

例如:

template<typename T>
struct typeOf{
   using type = T;
};

template<typename ...T> // All the arguments must be `typeOf`'s
class tupleOf : tuple<T::type...>{
}

这样:

tupleOf<typeOf<int>,typeOf<char>>会给我一个tuple<int,char>

我想在不使用C ++ 14功能的情况下执行此操作

3 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

template <typename T, template <typename> class f>
struct transform;


template <template <typename...> class C, typename...Ts, template <typename> class f>
struct transform<C<Ts...>, f>
{
    using type = C<typename f<Ts>::type...>;
};

用法:

static_assert(std::is_same<std::tuple<char, int>,
                           transform<std::tuple<char*, int*>, 
                                     std::remove_pointer>::type>::value,
              "unexpected");

Live Demo

答案 1 :(得分:1)

如果您只想找到解决特定问题的简单解决方案,这应该适合您:

namespace detail {
    //primary template for when something invalid is passed
    //could add a static_assert to improve compiler message
    template<typename... T> struct tupleOf;

    //partial specialization for when a list of typeOf types are passed
    template<typename... Ts>
    struct tupleOf<typeOf<Ts>...>
    {
        using type = std::tuple<Ts...>;
    };
}

//alias template for ease-of-use
template <typename... Ts>
using tupleOf = typename detail::tupleOf<Ts...>::type;

现在tupleOf<typeOf<int>,typeOf<char>>相当于std::tuple<int,char>

答案 2 :(得分:0)

简单转换已经在模式扩展的上下文中工作。如果您只是添加typename关键字,原始代码应该可以正常运行。

template<typename T>
struct typeOf{
   using type = T;
};

template<typename ...T> // All the arguments must be `typeOf`s
class tupleOf : tuple<typename T::type...>{
};

虽然模板别名可能是更好的选择。

template <typename... T>
using tupleOf = tuple<typename T::type...>;