に相当する組み込みのテンプレートはありませんが、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;