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(type_list<T1, T2>::type)いうよりは使いたいです。void test(cell<T1, cell<T2, null>>)私の質問は

  • 前者を使用できない具体的な理由は何ですか?
  • 回避策はありますか?cell(直接使用する場合を除く:( )

もちろん、type_list は型リスト生成のラッパーにすぎないため、「' の::type後に消去するだけtype_list<blah>」はオプションではありません。

ありがとうございました。

4

1 に答える 1

0

の存在:

template<typename T>
void test(T);

これにより、関数呼び出しに最適になります(セルに過負荷をかけるまで)。関数呼び出しを次のように変更してみてください。

test<int,int>(type_list<int, int>::type());
于 2012-05-11T05:30:21.983 に答える