关于模板类型的C ++设计问题

时间:2010-05-30 21:08:02

标签: c++ traits

我有一个模板类

  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 *>等。

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

还有其他选择吗?

4 个答案:

答案 0 :(得分:3)

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

template <>
    class MyContainerClass<int>

然后显然实现了使用带有整数的容器所需的一切。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

尽管其他人似乎都喜欢专业化,但我会选择特质。这有两个原因:

  1. 他们是伪装的“使用专业化”-idea,因为他们也使用专业化,但他们的想法是 外化 专业化,所以它们不会污染您的实际算法。

  2. 在标准库中使用它们是一种众所周知且众所周知的技术,每个人都能立即识别。相比之下,std lib中没有使用特化。 (我是否只是听到有人喊叫std::vector<bool>?)。

答案 3 :(得分: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];
};

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