2010-05-30 41 views
1

我有一个模板类C++设计问题上的模板类型

template <typename T> 
    class MyContainerClass 

对于类型来代替T,它必须满足许多要求:例如, get_id(),整数数据(),等

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

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

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

和内部MyContainerClass,调用性状::数据(),而不是数据()上T对象。 我会专门traits<int>, traits<const char *>

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

还有其他的选择吗?

回答

3

解决该问题的另一种方法是专门针对特定类型的模板,例如,

template <> 
    class MyContainerClass<int> 

然后明显地实现使用int整个容器所需的所有东西。

但我认为特质解决方案好得多。它也可以让你在其他容器和其他课程中重复使用这些特性。

0

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

0

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

  1. 他们是变相的“用专业化” -idea,因为它们使用的专业化,太多,但他们的想法是外部化的专长,让他们赢得了” t污染你的实际算法。

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

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]; 
}; 

,并专注于非类的类型,而无需枚举所有的基本类型(这需要宏的一些剂量进行维护......)