使用模板(而不是继承)的类中的类型规范

时间:2011-09-09 14:12:58

标签: c++ templates

从类继承时,只需查看层次结构即可了解强加给您的要求和限制。例如,您可以通过查看父类(es)需要定义哪些方法(纯虚拟)来查找。如果选择使用模板(如果它适合账单)那么事情就不那么清楚了。模板类的方法可能需要使用type的几种方法。

我遇到了一个我必须使用的复杂类。我不知道我的type(类/对象)应该有什么方法。我能找到的唯一方法是编译编译器让我知道哪些方法是预期的。这就像从一个抽象类继承而无需访问头文件。这有点痛苦,因为弄清楚方法规范(签名)是耗时的。

现在,该类的原始设计者可以提供一些文档,说明预期存在哪些方法及其签名,但我不禁想知道是否有一种方法可以自我记录代码(或者是已经和我不知道如何查看它?)。编译和查看错误不是唯一的方法,可以吗?

4 个答案:

答案 0 :(得分:4)

您实际上是通过为程序员提供在编译时强制执行type的要求的方法来描述C++0x concepts要解决的问题。但是,由于时间限制,它于2009年7月被删除。

Boost中只有一个名为Concept Check Library(BCCL)的库解决方案。但是,BCCL和C ++ 0x概念之间的there are differences。它与我们对当前语言的概念最为接近。

如果您不想使用BCCL,那么文档是下一个最好的选择。

答案 1 :(得分:1)

C ++ 11中有concepts的提案可以解决这个问题:概念本质上是模板参数必须满足的接口的描述。如果你现在需要它,你可以从Boost Concept Check Library获得类似的功能,但是必须设计一个类从一开始就使用概念断言,所以如果你有一个现有的库你就不走运了。

答案 2 :(得分:1)

C ++ 11添加了static_assert(可以通过BOOST_STATIC_ASSERT在C ++ 03中模拟)。现在你可以编写很多这样的断言,这些断言将在编译时触发,并为其添加人类可读的文档,说明断言触发的原因。根据你必须测试的设备(即C ++ 11 type_traits或者只有boost.type_traits),你可以做更多或更少的事情(也考虑使用decltype来检查做某些事情的可能性,也许与sizeof技巧相结合) ,很难说通用)

答案 3 :(得分:0)

使用合成和纯虚拟类可以避免此问题。使用和理解界面更容易。了解实现如何实现接口更容易。单元测试更容易。

struct B {
  virtual ~B() {}
  virtual void foo() const = 0;
  virtual void bar() const = 0;
};

struct D : public B {
  virtual ~D() {}
  virtual void foo() const {foo_thing.call();}
  virtual void bar() const {bar_thing.call();}
private:
  some_foo_like_thing foo_thing;
  some_bar_like_thing bar_thing;
};

我希望谈论在纯虚拟界面中应该和不应该是什么应该更容易,尽管里程可能会有所不同。 ;)

欣赏某些东西所需的信息越多,理由就越难。如果你的类依赖于它的父类的实现,那么你基本上必须理解它和它的每个前辈。不仅是界面,还有实施。

如果我要设计一种语言,实现继承甚至都不是一种选择。