【问题标题】:Partial specialization of nested template template class嵌套模板模板类的部分特化
【发布时间】:2019-03-07 15:22:24
【问题描述】:

我目前正在为模板模板(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";

现在我们想要实现的是一个类,它封装了一些对引入结构的计算,例如。应该这样调用:

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?

提前致谢

【问题讨论】:

  • “我们可以像下面这样使用它:Rectangle&lt; int, V4 &gt; a; 不,我们不能 - Rectangle&lt;T&gt; 没有定义,其中 T 不是 float
  • 更改了代码。现在它应该可以工作了
  • 您可能希望根据 c++14 标签 wiki 上的请求将您的标签之一更改为 [c++],您可能会获得更多可见性。

标签: c++11 templates c++14 template-specialization partial-specialization


【解决方案1】:

答案似乎相当简单:

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( ) {
        /*...*/
    }
};

[Live example]

【讨论】:

  • 谢谢!没有看到森林的树木。 ://
猜你喜欢
  • 2018-11-26
  • 1970-01-01
  • 2016-01-11
  • 2023-03-27
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多