c++ - 需要有关 C++ v11 类模板中类型约束设计的建议

标签 c++ types type-constraints

我想在类模板 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/

相关文章:

c++ - 根据他们的年龄按升序显示他们的名字?

具有多个类约束的 Haskell 类型签名

types - 在Perl 6中创建Maybe类型

memory - 使用 fileinfo 获取 mime 类型,是大文件的好方法吗?

f# - F#中类型约束的顺序

haskell - 你能在 Haskell 中为整个类而不是类型创建一个类的实例吗?

对类型构造函数参数具有接口(interface)约束的 Idris 相关记录

c++ - 如何让 yacc/bison 和 lex/flex 暂停文件扫描?

使用转换 (STL) 时的 C++ 错误

c++ - 为什么这是一个传递指针函数?