嵌套模板模板的部分特化 class
Partial specialization of nested template template class
我目前正在为模板模板 (template) 的部分模板专业化而苦苦挣扎 class。我知道我们可以通过继承实现以下问题,但目标是仅使用模板和模板专业化。
让我们考虑这段代码:
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 ) { /*...*/ }
};
classes V2 和 V12 可以被视为某种包装器 classes,用于内置类型或聚合。 classes 矩形和多边形使用 V2 或 V12,并且是部分特化的。
到目前为止,一切都很好。我们可以像下面这样使用它:
Rectangle< float, V4 > a;
std::cout << a.get(1) << "\n";
现在我们想要实现的是一个class,它封装了一些对introduce结构的计算。应该这样称呼:
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( ) {
/*...*/
}
};
现在的问题是:如何声明模板classCalculateCenter?
提前致谢
答案似乎很简单:
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( ) {
/*...*/
}
};
我目前正在为模板模板 (template) 的部分模板专业化而苦苦挣扎 class。我知道我们可以通过继承实现以下问题,但目标是仅使用模板和模板专业化。
让我们考虑这段代码:
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 ) { /*...*/ }
};
classes V2 和 V12 可以被视为某种包装器 classes,用于内置类型或聚合。 classes 矩形和多边形使用 V2 或 V12,并且是部分特化的。 到目前为止,一切都很好。我们可以像下面这样使用它:
Rectangle< float, V4 > a;
std::cout << a.get(1) << "\n";
现在我们想要实现的是一个class,它封装了一些对introduce结构的计算。应该这样称呼:
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( ) {
/*...*/
}
};
现在的问题是:如何声明模板classCalculateCenter?
提前致谢
答案似乎很简单:
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( ) {
/*...*/
}
};