4

次のクラスがあるとします。

template <class T, template <typename> class B>
class A { B<T> b; };

次のようなコードを記述できるようになりました。

A<float, MyVector> a1;
A<int, MySet> a2;

1つを除いてすべてのパラメータが指定されているマルチパラメータクラスをBに配置する最もエレガントな方法は何ですか? int キーを持つマップが好きですか? 私が思いつくことができる唯一のものはこれです:

template <class U> using C = MyMap<int, U>;
A<float, C<int>> a3;

パラメータの一部のみを提供し、そのうちの 1 つを開いたままにしておくことができる、std::bind に相当するテンプレートはありますか? 言語がこれを提供していないと確信していますが、人々は以前にこれを解決したに違いありません。

A<float, MyMap<int, _>> a3;
4

1 に答える 1

4

に相当する組み込みのテンプレートはありませんが、std::bind自分で作成できます。これは、ニーズに合わせて拡張できる最初のテンプレート引数をバインドする単純なバージョンです。

template <typename T, template <typename...> class B>
struct bind_t1 {
    template <typename... Ts>
    using type = B<T,Ts...>;   
};

次に、次のbind_t1ように使用します。

A<float, bind_t1<int, std::map>::type> a3;

この例では、テンプレート パラメーターを変更して、可変個のテンプレート テンプレートを取得する必要があることに注意してください。

template <class T, template <typename...> class B>
class A { B<T> b; };

以下は、パラメーター リストの先頭で多数の連続した要素をバインドできる、わずかに拡張されたバージョンです。

template <template <typename...> class B, typename... Ts>
struct bind_nt1 {
    template <typename... Us>
    using type = B<Ts...,Us...>;   
};

//Usage
A<std::less<int>, bind_nt1<std::map, int, float>::type> a3;

std::bindこれは、物事のやり方に基づいた一般的なバージョンです。検証は行わず、おそらくいくつかの特殊なケースがありますが、出発点としては適切です。改善のためのPiotr Skotnickiに感謝します。

template <std::size_t N> 
struct placeholder{};

template <template <typename...> class B, typename... Ts>
struct bind_t {
private:
    template <typename T, typename UTuple>
    struct resolve_placeholder {
        using type = T;
    };

    template <std::size_t N, typename UTuple>
    struct resolve_placeholder<placeholder<N>, UTuple> {
        using type = typename std::tuple_element<N-1, UTuple>::type;
    };

public:
    template <typename... Us>
    using type = B<typename resolve_placeholder<Ts, std::tuple<Us...>>::type...>;
};


//Usage 
A<int, bind_t<std::map, float, placeholder<1>, std::less<float>>::type> a3;

これを使用して、テンプレート パラメータの順序を変更することもできます。

//std::map<int,float>
bind_t<std::map, placeholder<2>, placeholder<1>>::type<float, int> b;
于 2015-09-04T10:36:30.467 に答える