【问题标题】:Can I check that a class is *not* default constructible?我可以检查一个类*不是*默认可构造的吗?
【发布时间】:2013-06-06 15:50:39
【问题描述】:

首先,请注意我使用的是 C++03(并且 C++11 不是一个选项)。我正在使用 boost 概念来检查某个类是否可以默认构造:

BOOST_CONCEPT_ASSERT((boost::DefaultConstructible<my_class>));

但是,对于其他一些类,我想断言该类型确实 没有 具有默认构造函数。有没有办法做到这一点?

更新:致所有那些将问题标记为重复或已回答但未阅读的超级专家:我在第一段中声明我已经使用 boost 概念来检查类是默认的-constructible(这是应该重复的问题)。我还明确声明我不能使用 C++11,所以我无法使用 type_traits。那么,有人可以请我指出我的问题“已经回答”的具体部分吗?因为我还没找到。

【问题讨论】:

  • 如果您可以从 TR1 或通过编译器扩展访问 ,它有简单的解决方案。编译器也可能具有相关的内在函数。 (即 VS2010 可以)
  • 我在某个地方迷路了,不是添加!在引用的表达式中你在追求什么?
  • @BalogPal:据我从代码中可以看出,这些断言不能通过为带括号的表达式的任何部分返回真值来工作。取而代之的是,其中涉及很多宏魔术,但归结为某些函数的代码,除非所讨论的概念成立,否则这些函数将无法编译。至少将无法编译的代码转换为编译代码,反之亦然。
  • 没有type_traits,很遗憾。严格来说是 C++03。
  • 再次声明:我不能使用 C++11,所以我不能使用is_constructible。真正读懂这个问题有那么难吗?

标签: c++ boost c++03


【解决方案1】:

令人失望的是,不,这在 boost 概念检查中是不可能的。

不那么令人失望的是:你不是想向后使用这个工具吗?

通常,您编写的代码需要具有一定数量特征的类型,例如构造函数、对该类型进行操作的函数等等。 我无法想象您会编写需要缺少特定功能的类型的代码的情况。

您似乎不想进行面向概念的编程,而是要强制执行编码风格。 而且这不是适合它的工具。

【讨论】:

  • ...因为具有比满足概念严格要求的特征更多的特征的类型确实满足该概念。
  • 不,不是编码风格。我正在使用模板,实际类型将在外部给出,所以我需要一种检查某些东西的方法。避免默认构造函数的原因是设计和有意识的:)
  • 无论如何!如果您实际上可以编写一段无法编译的代码,如果它们给您的类型具有默认构造函数:那么您可以编写概念检查...例如,默认构造函数的概念检查是一段代码只需将默认构造函数分配给函数指针...如果您无法编写一段在该类型具有默认构造函数时无法编译的代码,那么它就不是真正的概念检查。
猜你喜欢
  • 2012-04-14
  • 2011-11-05
  • 2016-01-10
  • 1970-01-01
  • 2019-09-22
  • 2012-09-04
  • 1970-01-01
  • 2013-03-23
  • 2018-10-04
相关资源
最近更新 更多