对于将此标记为重复的人:它不是;另一个问题是enum
,它们是编译时常量。这不是一个恒定的积分表达式,因此解决方案将是非常不同的。在建议已经在另一个问题中回答之前,请更仔细地查看下面的代码,因为它没有任何方式。我正在检查对象上的成员变量的值,在运行时创建的信息,我很好奇在这种情况下我可以用它做什么。
我正处于需要使用某些来使编译器失败的地方,如果我的API的用户做了她不应该做的事情。
我不知道这是否可能,是吗?我上面提到的选项主要是运行时,对吗?
例如,假设您有一个功能:
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
的建议不适用于此处。
答案 0 :(得分:6)
您可以static_assert()
编译时的条件(C ++ 11)
static_assert(false, "Hey user! You suck!");
或使用
#if (some_erroneous_condition_to_be_avoided)
#error "Hey user! You suck!"
#endif
如果你有一个与GNU兼容的编译器(g++
,clang++
等)。
答案 1 :(得分:3)
我可以看到检查编译时间的唯一方法是子类AwesomeClass
并将新类的创建限制为只能创建amazingObject.isntAmazing
永远不为真的对象。然后将签名更改为;
void doSomethingIncredible(AwesomeAndAmazingClass amazingObject)
这将阻止对方法的调用,这些对象只是很棒而不是很棒。
作为一个可能更具说明性的例子(未编译,因此考虑伪代码);
class Thing {
protected:
Color _color;
Shape _shape;
public:
Thing(Color color, Shape shape) {
_color=color; _shape=shape;
}
}
class GreenThing : Thing {
public:
GreenThing(Shape shape) : Thing(Color.Green, shape) {}
}
void doSomethingIncredible(GreenThing specialThing)
{
// specialThing here is still a Thing, but also compile time
// checked to also always be a GreenThing
}
答案 2 :(得分:0)
这是不可能的。变量的值在运行时决定,但是您希望根据运行时值抛出编译时错误。