3

これに非常によく似た Typelist 実装があります。タイプリストが何であるかがわからない場合: つまり、ネストされたタプルを使用する可変個引数テンプレートのように動作します。詳細については、こちらをご覧ください。

この型リストのサブセットから関数ポインター型を構築したいと思います。サブセットは (任意のサイズの) インデックスのリストによって定義され、目的の操作は型リスト内のこれらのインデックスのルックアップを行い、それらの型を引数として使用して関数のポインターの型を定義します。

API は次のようになります。

#include "typelist.h"
// typelist definition
typedef Typelist<float, Typelist<double, Typelist<int, NullType>>> Pixel;

typedef FunctionFromFields<Pixel, 0, 2>::Type field_0_and_2;
// I want the definition above to be equivalent to:
// typedef void (*field_0_and_2)(float*, int*);

コンパイル時にすべてが既知であるため、これが可能であると仮定するのは合理的ですが、そのための正しい構文をまだ見つけていません。

タイプリストを置き換えるために可変個引数テンプレートを使用したくありませんが、ポインター型を定義するために使用できます。

誰かが似たようなことをしましたか?

4

1 に答える 1

2

これはかなり簡単なはずです。最初にtypelist_nth型関数を定義します (演習として残しておきます。あなたの に型関数があると仮定しますtypelist.h):

template<typename TL, int I> struct typelist_nth;

次に、可変個引数テンプレートを使用して関数型を作成します。

template<typename TL, int... Is> struct FunctionFromFields {
    typedef void (*Type)(typename typelist_nth<TL, Is>::type *...);
};
于 2013-03-19T17:18:31.043 に答える