【发布时间】:2017-09-26 17:38:58
【问题描述】:
致将其标记为重复的人:不是;另一个问题解决了enums,它们是编译时常量。这不是一个恒定的积分表达式,因此解决方案将非常不同。在建议已经在另一个问题中回答之前,请更仔细地查看我的代码,因为它没有以任何方式。我正在检查对象上成员变量的值、运行时创建的信息,我很好奇在这种情况下我能用它做什么。
如果我的 API 的用户做了她不应该做的事情,我需要使用 something 使编译器失败。
我不知道这是否可能,是吗?我上面提到的选项主要是运行时的,对吧?
例如,假设你有一个函数:
void doSomethingIncredible(AwesomeClass amazingObject)
{
//perform life-changing work here except:
if (amazingObject.isntAmazing) //a bool property of object
//uh oh, life sucks, I refuse to compile this
现在调用这个函数将在各个方面改变你的生活方式,除了 amazingObject 开启了特定属性的情况,例如,在这种情况下,我希望编译器甚至不允许它通过,即无法运行程序。
函数体中的某处是一个强制编译失败的 c++ 机制,它会提醒用户你不能将这个函数用于这样一个低级的、不起眼的对象。
这可能吗?
为了澄清,这是我想根据变量的内容进行编译时的事情,如我上面的示例所示。使用static_assert 的建议不适用于此处。
【问题讨论】:
-
@RogerRowland 值得注意的是,该问题的答案都没有说明如何正确使用 static_assert ,因此我认为该问题是对我的问题的不完整解决方案。您可以看到我对 H2C03 答案的评论
-
布尔标志
isntAmazing是编译时间常数吗?仅当您在编译时知道某些内容时,才能为信息制作编译器错误。对于运行时值,您需要运行时断言。详细描述AwesomeClass的类型,以便有人可以帮助您。 -
@Fellowshee - 是的,我知道,这就是为什么我不建议它是重复的,只是表明它可能是有用的阅读。
标签: c++