在模板中插入类型

时间:2014-09-25 10:28:27

标签: c++ variadic-templates

我想定义模板

template<template<typename...> class TT, size_t n, class T, class... U>
struct insert;

在模板T内的参数n之间的U...位置插入TT类型。所以它应该以这样的方式工作,例如insert<std::tuple, 2, char, int,int,int,int>扩展为std::tuple<int,int, char, int,int>,即char插入到元组参数的正中间。

实施如下

template<template<typename...> class TT, size_t n, class T, class U1, class... U>
struct insert<TT, n, T, U1, U...>
{
    template<class...V>
    using templ = 
        /* template<typename...> */
        typename
        insert
        <
            typename insert<TT, n - 1, T, U...>::templ,   
            0, 
            U1
        >::templ < V... > ; // <-- error C2988: unrecognizable template 
                            //     declaration/definition

    using type = typename templ < > ;
};

template<template<typename...> class TT, class T, class... U>
struct insert < TT, 0, T, U... >
{
    template<class...V>
    using templ = TT<T, U..., V...>;

    using type = typename templ < > ;
};

但是编译失败了。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

template<template<typename...> class TT, class T, size_t n, class... U>
struct insert;

template<template<typename...> class TT, class T, class U1, class... U>
struct insert <TT, T, 0, U1, U...>
{
  using type = TT<T, U1, U...>;
};

template<template<typename...> class TT, class T>
struct insert <TT, T, 0>
{
  using type = TT<T>;
};

template<template<typename...> class TT, class T, size_t n, class U1, class... U>
struct insert<TT, T, n, U1, U...>
{
  template <typename... X> using templ = TT<U1, X...>;
  using type = typename insert<templ, T, n-1, U...>::type;
};

试验:

template <typename t1, typename t2, typename t3, typename t4>
struct test {};

using result = insert<test, int, 2, double, char, void*>::type;

int main()
{
    std::string s = typeid(result).name();
    int status;
    s = abi::__cxa_demangle(s.c_str(), NULL, NULL, &status);
    std::cout << s << std::endl;
}

Demo