, 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;
, , Variadic:
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...>;
};
A<std::less<int>, bind_nt1<std::map, int, float>::type> a3;
, std::bind, . , , , . .
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...>;
};
A<int, bind_t<std::map, float, placeholder<1>, std::less<float>>::type> a3;
, :
bind_t<std::map, placeholder<2>, placeholder<1>>::type<float, int> b;