【问题标题】:C++ Design Question on template types关于模板类型的 C++ 设计问题
【发布时间】:2010-05-30 21:08:02
【问题描述】:

我有一个模板类

  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&lt;int&gt;, traits&lt;const char *&gt;等。

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

还有哪些其他选择?

【问题讨论】:

    标签: c++ traits


    【解决方案1】:

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

    template <>
        class MyContainerClass<int>
    

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        1. 他们是变相的“使用专业化”的想法,因为他们也使用专业化,但他们的想法是外部化专业化,以便它们不会污染您的实际算法。

        2. 在标准库中使用它们是一种经过充分验证且众所周知的技术,每个人都立即认可。相反,在标准库中并没有太多使用特化。 (我是不是听到有人在喊std::vector&lt;bool&gt;?)。

        【讨论】:

          【解决方案4】:

          出于不同的原因,我也喜欢特质。使用 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];
          };
          

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-09-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-07-19
            相关资源
            最近更新 更多