2014-01-07 88 views
1

我試圖創建一個給定一組元函數和一個元函數的模板,將這個methafunction添加到提供的集合。variadic variadic模板模板專業化錯誤

template<template<template<typename...> class...> class Dest, 
        template<typename...> class FirstTpl, 
        template<typename...> class ...Tpls> 
struct template_push_front 
{ 
}; 

template<template<template<typename...> class...> class Dest, 
        template<typename...> class FirstTpl, 
        template<typename...> class ...Tpls> 
struct template_push_front<Dest, FirstTpl, Dest<Tpls...>> : Dest<FirstTpl, Tpls...> 
{ 
}; 
  • 元函數表示爲可變參數模板。
  • 目的地是現有的一組元功能
  • TPLS是目的地內容
  • FirstTpl是元功能被添加到目的地

的開頭當編譯我收到以下錯誤:

type/value mismatch at argument 3 in template parameter list for ‘template<template<template<class ...> class ...<template-parameter-2-1> > class Dest, template<class ...> class FirstTpl, template<class ...> class ... Tpls> struct template_push_front’ 
struct template_push_front<Dest, FirstTpl, Dest<Tpls...>> : Dest<FirstTpl, Tpls...> 

expected a class template, got ‘Dest<Tpls ...>’ 
就行

struct template_push_front<Dest, FirstTpl, Dest<Tpls...>> : Dest<FirstTpl, Tpls...> 

關於

Dest<Tpls...> 

令牌

我明白,編譯器無法識別目的地< TPLS ...>作爲類模板。我能做些什麼來編譯它?

+0

你能舉一個我們如何使用它的例子嗎? – dyp

+0

也許你可以發佈一個更完整的例子 - 包括你如何使用它? – Nim

+1

我猜你想要的東西,像'模板<模板<模板類...>類目的地, 模板類FirstTpl, 類List> 結構template_push_front { };'。然後你可以使用你提供的專業化(沒有改變)。然而,* primary *模板的第一個模板參數根本不需要,我寧願交換'FirstTpl'的位置和元函數列表。 – dyp

回答

2

猜測,我想如何使用這樣的事情,我想出了以下內容:

示範元函數的定義和元函數的一些列表:

template<class L, class R> 
struct some_binary_metafunction {}; 

template<class T> 
struct some_unary_metafunction {}; 

template< template<class...> class... MFs > 
struct some_list_of_metafunctions {}; 

push_front機制:

template< class List, template<class...> class MF > 
struct push_front; 

template< template< template<class...> class... > class ListT, 
      template<class...> class... ListEntries, 
      template<class...> class MF > 
struct push_front< ListT<ListEntries...>, MF > 
{ 
    using type = ListT<MF, ListEntries...>; 
}; 

測試用例/例如:

#include <iostream> 

template<class T> 
void print_type() 
{ 
    std::cout << __PRETTY_FUNCTION__ << "\n"; 
} 

int main() 
{ 
    using my_list = some_list_of_metafunctions<some_binary_metafunction, 
               some_binary_metafunction, 
               some_unary_metafunction>; 
    using result = push_front<my_list, some_unary_metafunction>::type; 

    print_type<result>(); 
} 
+0

謝謝你的例子。我的代碼中的錯誤是在第一個模板定義中。 – Marcin