我想定义模板
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 < > ;
};
但是编译失败了。 谢谢你的帮助。
答案 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;
}