在模板内插入文字

Insert type inside template

本文关键字:插入 文字      更新时间:2023-10-16

我想定义模板

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

在模板TT内的参数之间的第 n 位插入类型 T U...。所以它应该以这样的方式工作,例如 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;
}

演示。