В настоящее время я борюсь с частичной специализацией шаблона класса шаблона шаблона (template). Я знаю, что мы можем решить следующую проблему с наследованием, но цель состоит в том, чтобы использовать только шаблоны и специализацию шаблонов.
Рассмотрим этот фрагмент кода:
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";
Теперь то, что мы хотим получить, — это класс, который инкапсулирует, например, некоторые вычисления в структурах Introductions. Это должно называться так:
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?
заранее спасибо