1

我有一个模板类

  template <typename T>
    class MyContainerClass

对于要替换 T 的类型,它必须满足许多要求:例如 get_id()、int data() 等。

显然,没有一个基本类型(POD)是可替代的。我可以提供的一种方法是通过提供这些功能的 POD 的包装器。这是一种可以接受的方式吗?

另一种方法是将模板更改为:

template < typename T, typename C=traits<T> >
class MyContainerClass

在 MyContainerClass 中,在 T 对象上调用 traits::data() 而不是 data()。我会专攻traits<int>, traits<const char *>等等。

这是好设计吗?如何设计这样的特征类(完全静态方法或允许继承)?或者包装类是一个很好的解决方案?

还有哪些其他选择?

4

4 回答 4

3

解决它的另一种方法是将模板专门用于特定类型,例如

template <>
    class MyContainerClass<int>

然后显然实现了将容器与整数一起使用所需的一切。

但我认为特征解决方案要好得多。它还允许您在以后创建的其他容器和其他类中重用特征。

于 2010-05-30T21:12:39.457 回答
0

您会发现 std 非常广泛地使用 type_traits。您可能会检查它们是否真的满足您的需求,而且,这应该是对您的一个很好的暗示,即特征结构规范是正确的方法。

于 2010-05-30T21:22:16.630 回答
0

尽管其他人似乎都倾向于专业化,但我还是会选择特质。有两个原因:

  1. 他们是变相的“使用专业化”的想法,因为他们也使用专业化,但他们的想法是将专业化外部化,这样他们就不会污染你的实际算法。

  2. 在标准库中使用它们是一种经过充分验证且众所周知的技术,每个人都会立即认识到。相比之下,在标准库中并没有太多使用特化。(我刚刚听到有人大喊大叫std::vector<bool>吗?)。

于 2010-05-30T21:28:38.693 回答
0

出于不同的原因,我也喜欢特质。使用 sfinae,您可以获得一个有效的 is_class 谓词:

template <typename T>
struct traits
{
    static const bool is_class = sizeof(test<T>(0)) == 1;

private:
    template <typename U> char (&test(int U::*))[1];
    template <typename> char (&test(...))[2];
};

并专注于非类类型,而不必枚举所有基本类型(需要一些宏才能使其可维护......)

于 2010-06-23T09:59:32.560 回答