4

loki タイプリストの可変個引数テンプレート ラッパーを実装しようとしています。

loki スタイルで 2 つのタイプリストをマージするのは簡単ですが、可変長テンプレート スタイルでのマージには問題があります。

これは私の実装です(単純化され、 push_back 、 index_of 、...、メソッドなし)。

template<typename... Ts>
struct dl32TypeList;

template<typename HEAD , typename... TAIL>
struct dl32TypeList<HEAD,TAIL...>
{
    static const unsigned int size = sizeof...(TAIL) + 1;

    using value = dl32Loki_like_TypeList<HEAD, typename dl32TypeList<TAIL...>::value>;
};

template<>
struct dl32TypeList<>
{
    using value = dl32NoType;

    static const unsignedint size = 0;
};

私は次のようなものが欲しい:

template<typename OTHER_TYPELIST> 
using merge = dl32TypeList<HEAD , TAIL... , typename OTHER_TYPELIST::???>;

そして、これが問題です: 可変個引数のテンプレート引数を using/typedef として格納することはできないため、これを行う方法について何か考えがあります。(OTHER_TYPELIST::??? に注意してください)。

4

1 に答える 1

7

Loki や DL32 が何であるかはわかりません。また、何かを実装する必要があるかどうかも明確ではありません。

std::tuple型リストの一般的なツールです。ランタイム ストレージ コンテナーとして設計されていますが、型が完全である限り、コンパイル時のユーティリティとして機能します。タプルを連結する 1 つの方法を次に示します。

template< typename ... t >
struct tuple_cat
    { typedef decltype( std::tuple_cat( std::declval< t >() ... ) ) type; };

手動で行いたい場合は、部分的な特殊化を試してください。

template< typename ... t >
struct type_list {};

template< typename ta, typename tb >
struct type_cat;

template< typename ... a, typename ... b >
struct type_cat< type_list< a ... >, type_list< b ... > >
    { typedef type_list< a ..., b ... > type; };

メンバーに関してはsize、問題を完全に解決するための普遍的なメタ関数を作成できます。

template< typename >
struct count_types;

template< template< typename ... > class t, typename ... a >
struct count_types< t< a ... > >
    { static constexpr std::size_t value = sizeof ... a; };
于 2013-05-20T11:16:38.647 に答える