我想在编译期间检查是否使用/未使用某个类的某些功能,并相应地失败/通过编译过程。
例如,如果函数F1
在代码中的某处被调用,我希望编译成功,如果函数F2
被调用,我希望它失败。
关于如何使用预处理器、模板或任何其他 c++ 元编程技术的任何想法?
我想在编译期间检查是否使用/未使用某个类的某些功能,并相应地失败/通过编译过程。
例如,如果函数F1
在代码中的某处被调用,我希望编译成功,如果函数F2
被调用,我希望它失败。
关于如何使用预处理器、模板或任何其他 c++ 元编程技术的任何想法?
您可以使用 c++11 编译器来实现此目的,前提是您愿意修改 F2 以在函数体中包含一个 static_assert 并在签名中添加一个虚拟模板:
#include <type_traits>
void F1(int) {
}
template <typename T = float>
void F2(int) {
static_assert(std::is_integral<T>::value, "Don't call F2!");
}
int main() {
F1(1);
F2(2); // Remove this call to compile
}
如果没有 F2的调用者,代码将编译。请参阅此答案以了解为什么我们需要模板技巧并且不能简单地插入static_assert(false, "");
不是一个非常模板化的解决方案,但是您可以依赖编译器的弃用属性,如果在任何地方使用函数,它将生成警告。
在 MSVC 的情况下,您使用__declspec(deprecated)属性:
__declspec(deprecated("Don't use this")) void foo();
G++:
void foo() __attribute__((deprecated));
如果您有“将警告视为错误”编译选项(您通常应该这样做),您将获得所需的行为。
int main()
{
foo(); // error C4966: 'foo': Don't use this
return 0;
}