2015-06-03 26 views
6

Tôi đã xem qua bài viết này rất lớn: http://pdimov.com/cpp2/simple_cxx11_metaprogramming.htmlvariadic mẫu loại trừ

Trong đoạn mã sau:

template<class A, template<class...> class B> struct mp_rename_impl; 

template<template<class...> class C, class... T, template<class...> class B> 
struct mp_rename_impl<C<T...>, B> 
{ 
    using type = B<T...>; 
}; 

template<class A, template<class...> class B> 
using mp_rename = typename mp_rename_impl<A, B>::type; 

//... 
mp_rename<mp_list<int, float, void*>, std::tuple>; // -> std::tuple<int, float, void*> 
                // T... will be deduced as int, float, void* 

Tại sao C là suy luận như mp_list (thay vì mp_list < int, float , void *>) và T ...int, float, void *?

Tôi nghĩ rằng Bí quyết là phần mẫu chuyên môn: struct mp_rename_impl < C < T ...>, B>, Nhưng tôi đấu tranh để hiểu tại sao

+0

'A' nào? 'lớp A' hoặc' mẫu lớp A'? – Jarod42

+0

Tôi đổi tên thành C như bạn đã làm để làm cho nó rõ ràng hơn –

Trả lời

4

với

mp_rename<mp_list<int, float, void*>, std::tuple>; 
  • in

    template<class A, template<class...> class B> 
    using mp_rename = typename mp_rename_impl<A, B>::type; 
    

    Amp_list<int, float, void*>Bstd::tuple

  • trong

    template<class A, template<class...> class B> struct mp_rename_impl; 
    

    Amp_list<int, float, void*>Bstd::tuple trong cùng một cách.

  • trong chuyên môn hóa

    template<template<class...> class C, class... Ts, template<class...> class B> 
    struct mp_rename_impl<C<Ts...>, B> 
    

    (tôi đổi tên để C để được rõ ràng hơn)
    Cmp_list, Ts...int, float, void*Bstd::tuple.

+0

Tôi mất một thời gian để có được nó vì một lý do nào đó, nhưng tôi đã tự hỏi làm thế nào chúng ta có thể chia 'mp_list < Ts... >' thành 'mp_list' và' Ts ... '. Nhưng 'struct mp_rename_impl < C< Ts... >, B>' chuyên 'mẫu lớp B> struct mp_rename_impl;', là một kết hợp tốt hơn nếu 'A' ->' mp_list '. Chuyên môn 'struct mp_rename_impl < C< Ts... >, B>' cho phép chúng ta tách 'C' và' Ts ... ' –

Các vấn đề liên quan