我想在类模板 A
的类型参数 T
上放置一个 POD 类型约束,然后从中派生另一个类模板 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...
};
以便在传递非 POD 类型时无法实例化 A,因为您可能已经注意到部分参数化的作用类似于类型切换。
但我不知道如何定义 B。我认为它看起来像下面这样
template <typename A?>
class B;
template <>
B<const A?> : public A?
{
//blah...
};
template <>
B<A?> : public A?
{
//blah...
};
有什么好主意吗?
PS:我个人比较挑剔。但只需发布您认为无论如何都可以做到这一点。
最佳答案
如果特化要完全不同,那就没有绝妙的主意了。你必须这样做:
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
参见 online demo .请注意,您在这里忘记了 typename
:
typename std::enable_if<std::is_pod<T>::value>::type
我也解决了这个问题。
如果特化中的一些代码是相同的,那么你可以做一些技巧来分享共同的部分,但我不能提出任何建议,因为我不知道你是什么我们将投入特化。
关于c++ - 需要有关 C++ v11 类模板中类型约束设计的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15216089/