2014-09-25 59 views
0

插入型我想定義模板內模板

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

這將插入的n個地方型T在參數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
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

+0

完美!這就是所需要的,加上這麼簡單明瞭。 – 2014-09-25 12:03:13