別の可変長引数テンプレートから可変引数templeteを作ります

セルジオPvは:

正直に言うと、私は私が解決しようとする問題の解決策を検索するために開始するのか分かりません。おそらく解決策はすでにあります。だから、タスクはここにあります。

私は実際には2つの引数を持つテンプレートがあるクラスを持っています:

template <typename F, typename S>
class trans {...};

また、私はタプル(例)のように、これらの「トランス」クラスのチェーンを保持している別のクラスを持っています:

class holder {
    using chain_type = std::tuple<trans<std::string, int>, 
                                  trans<int, float>, 
                                  trans<float, std::string>, 
                                  trans<std::string, json>>;
};

そして、「トランス」の見られるように、すべての第二引数は、次の第1と同じです。チェーン:

std::string -> int -> float -> std::string -> json.

私が何をしたいだろう...私はこのように、このチェーンを作るためにいくつかの方法を持っているしたいと思います:

template <typename ...Args>
class holder {
    using chain_type = trans_chain_create_t<Args...>;
};

holder<std::string, int, float, std::string, json> h;

出来ますか?私は可変長テンプレートに精通していないよと非常に稀にそれらを使用します。

アンドレイSemashev:

はい、それは可能です:

template< typename F, typename S >
class trans {};

template< typename F, typename S, typename... Tail >
struct create_trans_chain;

template< typename F, typename S, typename... Tail >
using create_trans_chain_t = typename create_trans_chain< F, S, Tail... >::type;

template< typename F, typename S >
struct create_trans_chain< F, S >
{
    using type = std::tuple< trans< F, S > >;
};

template< typename F, typename S, typename Next, typename... Tail >
struct create_trans_chain< F, S, Next, Tail... >
{
    using type = decltype(std::tuple_cat(
        std::declval< create_trans_chain_t< F, S > >(),
        std::declval< create_trans_chain_t< S, Next, Tail... > >()));
};

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=370147&siteId=1