我想定义模板

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 < > ;
};


但是编译失败。
感谢帮助。

最佳答案

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

10-05 22:43
查看更多