Да, определите второй шаблон «получателя» с частичной специализацией.
template< typename >
struct get_Small_X; // base template is incomplete, invalid
template< typename X > // only specializations exist
struct get_Small_X< Small< X > > {
typedef X type;
};
Теперь вместо Small<X>::X
у вас есть typename get_Small_X< Small<X> >::type
.
Кстати, _X
является зарезервированным идентификатором, поэтому его не следует использовать ни для чего.X_
- лучший выбор.
Дополнительная тема: самоанализ шаблона.
Пока я думаю об этом, вам не нужно определять это отдельно для каждого шаблона.Один главный шаблон должен это делать.
Это компилируется в Comeau, я знаю, что есть правила для сопоставления аргументов шаблона шаблона, но я думаю, что все в порядке… Аргументы шаблона шаблона запрещены в шаблоне master в частичной специализации.
template< typename >
struct get_first_type_argument;
template< template< typename > class T, typename X >
struct get_first_type_argument< T< X > > {
typedef X type;
};
template< typename X >
struct simple;
get_first_type_argument< simple< int > >::type q = 5;
Это работает только с "унарными" шаблонами, но может быть адаптировано в C ++ 0x для общего случая.