【问题标题】:boost_assert that a parameter class implements a certain methodboost_assert 参数类实现了某个方法
【发布时间】:2011-04-30 06:28:16
【问题描述】:

假设你有一个带有参数类的模板

template <typename ConnectorClass>
struct myClass {

}

我想添加一个BOOST_ASSERT_MSG来验证ConnectorClass实现了某种签名方法

returnType MethodName(param1, param2)

这种情况下断言条件应该怎么写?

编辑:由于该问题似乎没有明确的解决方案,因此我根据答案中的一些参考发布了一个带有中间结果的子问题 请关注here

【问题讨论】:

标签: c++ boost metaprogramming assert compile-time


【解决方案1】:

你不能。 BOOST_ASSERT_MSG 在运行时进行评估。如果该类没有该成员,那么无论您的模板需要它,您都会收到编译错误。

如果您的目标是更好的错误消息,请查看 Boost 的概念检查库。如果您的目标是让您的模板根据可用的成员执行不同的操作,请查看 Boost 的 enable_if

Here's an answer to a similar question.

【讨论】:

  • 嗯,我很确定 BOOST_ASSERT_MSG 是在编译时评估的,但是我不知道 Concept Check 库,值得一试,谢谢!
  • 你可能会想到 BOOST_STATIC_ASSERT。
【解决方案2】:

如果您使用的是 Windows,并且不太挑剔,您可以通过 __if_exists, a hack extension to Visual C++ 进行此操作

【讨论】:

  • 谢谢,很高兴知道。但现在我只在 OS X 和 ubuntu 上工作
  • @lurscher - 如果可能的话,最好还是做得更干净。这里还有另一个可能有用的讨论:programming.itags.org/c-c++/72176
【解决方案3】:

查看 Boost 中的各种静态断言实用程序。特别是:

  • BOOST_STATIC_ASSERT(参见文档here
  • BOOST_MPL_ASSERT(参见文档here

【讨论】:

    猜你喜欢
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多