2015-04-01 90 views
2

我们有几个C++函数将在我们项目的阶段2中实现,它们是公共接口或其各自的类和模块的一部分。因为它们是公共接口的一部分,所以我们认为它们应该存在于第一阶段的标题中,以便我们在实施其余类时仍然在考虑它们。但是,由于它们未实现,我们不希望任何人给它们打电话。我们希望此检查在编译时发生,以确保正确性。C++编译时未执行的检查

我的愿望是:

  • 编译时间(可能是一个错误或警告;警告更好,因为它们更灵活 - 我们可以选择将它们关闭)

  • G上作品+ +4.8.1并且不会在Visual Studio 2013下终止构建(我们仅使用Visual Studio/VisualAssistX作为编辑器,但重构工具在没有构建的情况下无法运行)

  • 不太难理解所做的事为什么

  • 功能存在类文档中(我们可以包括一些\warning not implemented in phase 1符号来doxygen的回暖)

我正在考虑三个选项:

  • 的腰带和背带的做法marking them as deprecated(它会产生一个警告)并抛出一个自定义的异常 - 这几乎是我想要的,除了编译器警告它“被弃用”与真实情况相反:现在不推荐使用的方法,但不会以后;这种方法将工作后,但现在不工作

  • 另一个答案告诉how to forbid using a function while still having it exist - 这是很好,但难以阅读,很难搜索。另外,这是一个编译时错误 - 如果我们改变主意,我们不能让一些函数调用它 - 它是全部或者全部。并且使每个未实现的函数都成为一个模板,这让我怀疑这个技巧是否会始终有效。例如,虚拟函数不能是模板。

  • 只是把它们作为一个评论 - 从美其名曰保持人,但他们也不会自动生成的文档中出现(我们不能决定以后有选择性呼叫)

有没有更好的方法?如果不是,是否有理由更喜欢模板或评论选项而不是弃用选项?

+0

['static_assert'](http://en.cppreference.com/w/cpp/language/static_assert)? – 2015-04-01 15:15:48

+0

@JoachimPileborg(与模板)是什么在[禁止使用](http://stackoverflow.com/a/18814056/309334)答案我在上面提到。 [这个答案](http://stackoverflow.com/a/5246686/309334)说明了为什么模板是必要的。 – Eponymous 2015-04-01 15:20:31

回答

1

作为替代方案:

你可以只声明它们而不清晰,让您得到链接错误。
然后,您可以提供一个带有空定义的库not_yet_implemented以允许过早使用这些功能。

马克您删除方法:= delete,最终被包裹在一个宏

#define NOT_YET_IMPLEMENTED = delete 
+0

通过包含'not_yet_implemented'库,它可以有效地使函数在任何地方都可调用 - 删除未实现的检查。我可以想象想要这样做的情况就像'int foo(){do_stuff_needed_in_all_phases(); if(condition_only_true_in_phase2){unimplemented_function(); }}'这将使我们不必在第二阶段重新实现'foo()'。但是,我想'int bar(){unimplemented_function(); }'仍然失败。 – Eponymous 2015-04-01 15:40:52

+0

由于上述原因,我更喜欢我的“弃用”解决方案。不过,这是唯一的答案,所以我会接受它。感谢您抽出时间来解决别人的问题,让互联网变得更美好。 – Eponymous 2015-04-02 19:50:18