C++ 检测类型是否抛出

C++ 检测类型是否抛出,c++,metaprogramming,C++,Metaprogramming,有没有一种方法可以静态检测类的任何成员是否可以抛出异常?一些元编程技巧?不,您不能(假设您想知道该方法引发异常)。程序员可以在方法声明中使用“throw”关键字,但它是可选的。因此,没有方法知道一个方法是否抛出异常。C++中的< p>没有与java中一样的检查异常的等价性。 因此,除非有文档记录或您知道实现细节,否则无法知道方法是否引发任何类型的异常。 例如,仅对内置类型进行操作的方法保证不会引发任何异常。 在声明中包含空throw规范的方法“说”它只会为致命错误抛出异常 int foo() t

有没有一种方法可以静态检测类的任何成员是否可以抛出异常?一些元编程技巧?

不,您不能(假设您想知道该方法引发异常)。程序员可以在方法声明中使用“throw”关键字,但它是可选的。因此,没有方法知道一个方法是否抛出异常。C++中的

< p>没有与java中一样的检查异常的等价性。 因此,除非有文档记录或您知道实现细节,否则无法知道方法是否引发任何类型的异常。
例如,仅对内置类型进行操作的方法保证不会引发任何异常。
在声明中包含空throw规范的方法“说”它只会为致命错误抛出异常

int foo() throw(); //does not mean it will never throw an exception
即使通过
new
运算符进行分配,也可能引发异常。

程序员有责任明确指定他的方法所提供的无抛出保证。

您的确切意思是什么?如果成员函数抛出?如果构造函数抛出?两者都有?你是说它是否可以抛出异常?或者它是否真的对某些给定的输入集这样做?(这需要解决停顿问题)(前者也是如此,除非你允许误报)。。。您需要静态(编译时)还是动态(运行时)检测这个问题?不,没有办法。现在你不需要问这些“分步”问题,而需要问你想要解决的真正问题。我认为OP在这里受到了不公平的待遇。他的问题对我来说似乎非常清楚:对于指定的类,它的任何成员函数都可能抛出异常吗?它与异常规范无关。这个问题可以通过检查源代码来回答:枚举方法,检查方法代码(或者它可能调用或继承的内容)是否会引发异常。这容易吗?不,但我认为这个问题可以通过一个工具来解决,这个工具只需使用源代码中可用的事实。(我构建了可以收集这些信息的工具)。