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は、タイプのリストを生成するための単なるラッパーであるオプションにすることはできません。
ありがとう
[テンプレート領域の非重力コンテキスト](0120-18751) – iammilind
手元にある問題提案された重複は、重大ではない文脈に関するものであり、2つの状況はまったく同じではない。より良い一致がなければならない。 –