Частичная специализация вложенного шаблона класса шаблона - PullRequest
0 голосов
/ 07 марта 2019

В настоящее время я борюсь с частичной специализацией шаблона шаблона (шаблона) класса.Я знаю, что мы можем реализовать следующую проблему с наследованием, но цель состоит в том, чтобы использовать только шаблоны и специализацию шаблонов.

Давайте рассмотрим этот фрагмент кода:

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?

Заранее спасибо

1 Ответ

0 голосов
/ 07 марта 2019

Ответ кажется довольно простым:

template < class T >
struct CalculateCenter;

template< typename T >
struct CalculateCenter< Rectangle< T, V2 > > {
    static T doIt( ) {
        /*...*/
    }
};

template< typename T >
struct CalculateCenter< Polygon< T, V12 > > {
    static T doIt( ) {
        /*...*/
    }
};

[Живой пример]

...