В настоящее время я борюсь с частичной специализацией шаблона шаблона (шаблона) класса.Я знаю, что мы можем реализовать следующую проблему с наследованием, но цель состоит в том, чтобы использовать только шаблоны и специализацию шаблонов.
Давайте рассмотрим этот фрагмент кода:
template< typename T >
struct V4;
template< >
struct V4< float > {
using point_type = std::array< float, 4 >;
};
template< typename T >
struct V12;
template< >
struct V12< int > {
using point_type = std::array< int, 12 >;
};
template< typename T, template< typename = T > class IM >
struct Rectangle;
template< template< typename > class IM >
struct Rectangle< float, IM > {
float get( size_t i ) { /*...*/ }
};
template< typename T, template< typename = T > class IM >
struct Polygon;
template< template< typename > class IM >
struct Polygon< int, IM > {
float get( size_t i ) { /*...*/ }
};
Классы V2 и V12 можно рассматривать как своего рода классы-оболочки для встроенных типов или агрегатов.Классы Rectangle и Polygon используют V2 или V12 и являются частично специализированными.Все идет нормально.Мы можем использовать это следующим образом:
Rectangle< float, V4 > a;
std::cout << a.get(1) << "\n";
Теперь мы хотим достичь класса, который инкапсулирует некоторые вычисления, например, для вводных структур.Его следует называть так:
std::cout << CalculateSomething< Rectangle< float, V4 > >::doIt( ) << "\n";
CalculateSomething должен быть частично специализирован, чтобы понять, работает ли он с прямоугольником или многоугольником.Таким образом, возможная специализация должна выглядеть следующим образом:
template< typename T >
struct CalculateCenter< Rectangle< T, V2 >, T > {
static T doIt( ) {
/*...*/
}
};
template< typename T >
struct CalculateCenter< Polygon< T, V12 >, T > {
static T doIt( ) {
/*...*/
}
};
Теперь возникает вопрос: как объявить шаблон класса CalculateCenter?
Заранее спасибо