Есть ли способ извлечь из компилятора частичную специализацию по умолчанию?
Скажем, у меня есть этот шаблон с двумя параметрами:
template<typename A, typename B>
struct X {
A a;
B b;
};
и у меня также есть код, который использует шаблон с одним параметром, например:
template<template<typename> class T, typename B>
struct make_T_of_B {
T<B> member;
};
Я хочу сказать:
make_T_of_B<X<int>, double> dummy;
где X ‹int› используется как шаблон с одним параметром. Это было бы эквивалентно этому шаблону:
template<typename B>
struct Y {
int a;
B b;
};
что похоже на специализацию X ‹int, B›, фактически ничего не меняя. Это похоже на специализацию по умолчанию, за исключением того, что специализация по умолчанию создает не другой шаблон, а реальный тип (другими словами, он всегда общий).
Я понимаю, что могу каскадировать аргументы шаблона
template<typename A>
struct Z1 {
// start from scratch
template<typename B>
struct Z2 {
A a;
B b;
};
// inherit from double template above
template<typename B>
struct X: ::X<A, B> {};
};
make_T_of_B<Z1<int>::Z2, double> dummy1;
make_T_of_B<Z1<int>::X, double> dummy2;
но я считаю, что это довольно трудно читать, и я не могу четко передать мои намерения.
Спасибо.
template <typename T> using Foo = X<int, T>;
? Теперь вы можете использоватьFoo<double>
и получитьX<int, double>
. - person Kerrek SB   schedule 12.11.2013