C++ 强制编译器抛出错误的最简单方法是什么?

C++ 强制编译器抛出错误的最简单方法是什么?,c++,C++,对于将此标记为重复的人员::它不是;另一个问题涉及enums,它们是编译时常量。这不是一个常数积分表达式,因此解会非常不同。请仔细阅读下面的代码,然后再提出另一个问题,因为它没有以任何方式得到回答。我正在检查对象上成员变量的值,以及在运行时创建的信息,我很好奇在这种情况下我能做些什么 如果API的用户做了一些她不应该做的事情,我需要使用一些东西来使编译器失败 我不知道这是否可能,是吗?我上面提到的选项主要是运行时的,对吗 例如,假设您有一个函数: void doSomethingIncr

对于将此标记为重复的人员::它不是;另一个问题涉及
enum
s,它们是编译时常量。这不是一个常数积分表达式,因此解会非常不同。请仔细阅读下面的代码,然后再提出另一个问题,因为它没有以任何方式得到回答。我正在检查对象上成员变量的值,以及在运行时创建的信息,我很好奇在这种情况下我能做些什么


如果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++机制,它提醒用户,不能使用这个函数来处理这样一个低级的非令人惊奇的对象。 这可能吗

为了澄清这一点,我希望在编译时根据变量的内容执行此操作,如上面的示例所示。使用静态断言的建议在这里不适用。

您可以在编译时使用一个条件(C++11)

或使用

#if (some_erroneous_condition_to_be_avoided)
#error "Hey user! You suck!"
#endif

如果你有一个GNU兼容的编译器(
g++
clang++
,等等)

我能看到的唯一检查编译时的方法是将
AwesomeClass
子类化,并将新类的创建限制为只能创建
amazingObject.isntAmazing
永远不为真的对象。然后将签名更改为

void doSomethingIncredible(AwesomeAndAmazingClass amazingObject)
这将阻止对简单但不惊人的对象调用该方法

作为一个更具说明性的例子(未编译,所以考虑伪代码);


这是不可能的。变量的值是在运行时决定的,但您希望根据运行时值引发编译时错误。

您看到了吗@罗杰罗兰德值得注意的是,没有一个问题的答案表明如何实际使用Stista断言正确,所以我认为这个问题是一个不完整的解决我的问题在这里。您可以看到我对H2C03答案的评论,bool标志
isntAmazing
是编译时常量吗?只有当您在编译时知道某些信息时,才可以为这些信息设置编译器错误。对于运行时值,您需要运行时断言。请详细描述
AwesomeClass
的类型,以便有人能帮助您。@Fellowshee-是的,我知道,这就是为什么我没有建议它是一个副本,只是表明它可能是一个有用的读物。我不清楚如何正确地使用
静态断言。第一个参数需要一个整型常量表达式,但当我只想测试某个特定变量是真是假时,我不确定如何创建这样的表达式。这被认为不是正确的断言表达式。@Fellowshee如果要检查某个变量是真是假,则不能使用
static\u assert
。您必须在运行时验证这一点。MSVC是否不支持
#error
?这是一个标准的pp指令(如果您试图找到它,请查找“#error”)。
#error
条件不适用于这个问题,因为这是预处理阶段的事情,甚至在实际编译之前就出现了。伟大的解决方案表明,即使其他人都说不能在编译时完成,一个新的C++特性的使用证明了很多思想是可能的。
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
}