0

我想在T类模板的类型参数上放置一个 POD 类型约束A,然后B从令人满意的A. 此外,B应该根据实例的恒定性有不同的实现A。众所周知,这样做的目的是为了在运行前更好地进行类型检查。

我能想出的只是一个暂定的定义A

template <typename T, typename POD=void>
class A;
template <typename T>
class A <T, std::enable_if<std::is_pod<T>::value>::type>
{
    //blah...
};

这样 A 在传递非 POD 类型时就不能被实例化,因为您可能已经注意到部分参数化的作用就像类型切换一样。

但我不知道如何定义 B 。我认为它看起来像以下

template <typename A?>
class B;
template <>
B<const A?> : public A?
{
    //blah...
};
template <>
B<A?> : public A?
{
    //blah...
};

有什么绝妙的主意吗?

PS:就我个人而言,我倾向于高度批评。但是,请发布您认为无论如何都可以做到的方式。

4

1 回答 1

1

如果专业化完全不同,没有什么好主意。你必须这样做:

template <typename T>
class B;

template <typename T>
class B<const A<T>> : public A<T>
{

};

template <typename T>
class B<A<T>> : public A<T>
{

};

除了符号之外,这与您自己编写的几乎相同。?

您可以将此类实例化为:

B<A<int>>       x; //it chooses the second specialization
B<const A<int>> y; //it chooses the first specialization

在线演示。请注意,您在typename这里忘记了:

typename std::enable_if<std::is_pod<T>::value>::type

我也修好了。

如果专业中的某些代码是相同的,那么您可以做一些技巧来共享公共部分,但我不能提出任何建议,因为我不知道您将在专业中放入什么。

于 2013-03-05T05:03:35.617 回答