2012-05-11 12 views
3

タイプリスト用のアダプタコードをいくつか記述しようとしています。下記の目的のための実験的なコードです:特定のタイプのリストに対して関数がオーバーロードされています

struct null 
{ 
}; 

template<typename first, typename second> 
struct cell 
{ 
    typedef first head; 
    typedef second tail; 
}; 

template < 
    typename T1 = null, typename T2 = null, typename T3 = null, 
    typename T4 = null, typename T5 = null, typename T6 = null, 
    typename T7 = null, typename T8 = null, typename T9 = null, 
    typename T10 = null, typename T11 = null, typename T12 = null, 
    typename T13 = null, typename T14 = null, typename T15 = null, 
    typename T16 = null, typename T17 = null, typename T18 = null 
> 
struct type_list 
{ 
private: 
    typedef typename type_list < 
     T2, T3, T4, T5, T6, T7, T8, T9, T10, 
     T11, T12, T13, T14, T15, T16, T17, T18 
    >::type tail; 

public: 
    typedef cell<T1, tail> type; 
}; 

template<> 
struct type_list<> 
{ 
    typedef null type; 
}; 

template<typename T> 
void test(T); 

#include <cstdio> 

template<typename T1, typename T2> 
void test(typename type_list<T1, T2>::type) 
{ 
    // won't be instantiated 
    printf("type_list<T1, T2>::type\n"); 
} 

template<typename T1, typename T2> 
void test(cell<T1, cell<T2, null>>) 
{ 
    printf("cell<T1, cell<T2, null>>\n"); 
} 

int main() 
{ 
    // Below causes compile error when 'void test(cell<T1, cell<T2, null>>)' is absence 
    test(type_list<int, int>::type()); 
} 

出力:

cell<T1, cell<T2, null>> 

私は、前者がもう少し簡潔であるため、というよりもvoid test(cell<T1, cell<T2, null>>)void test(type_list<T1, T2>::type)を使用します。私の質問は

  • 私は前者を使用できない特定の理由は何ですか?
  • 回避策はありますか?ただ消去::タイプTYPE_LIST後に「のでもちろん

(:(直接「セル」を使用することを除いて)、TYPE_LISTは、タイプのリストを生成するための単なるラッパーであるオプションにすることはできません。

ありがとう

+0

[テンプレート領域の非重力コンテキスト](0120-18751) – iammilind

+0

手元にある問題提案された重複は、重大ではない文脈に関するものであり、2つの状況はまったく同じではない。より良い一致がなければならない。 –

答えて

0

の存在:。(あなたは、細胞の過負荷に入れるまで)

template<typename T> 
void test(T); 

が、それはあなたの関数呼び出しのためにベストマッチされるようにするには、あなたの関数呼び出しを変更してみてください:。

test<int,int>(type_list<int, int>::type()); 
関連する問題