Yve*_*ves 2 c++ templates metaprogramming enable-if
我正在开发一个C++库,有两个函数:func1和func2。
func1如果开发人员在调用之前忘记调用,我想生成编译时错误func2:
这样就可以了:
func1();
func2(); // OK
Run Code Online (Sandbox Code Playgroud)
但这会失败:
func2(); // ERROR, you forget to call func1()
Run Code Online (Sandbox Code Playgroud)
当然,很容易生成运行时错误,但我想生成编译时错误。
我已经尝试如下,但它不起作用,因为我无法修改constexpr变量:
static constexpr bool b {false};
void func1() {
b = true; // ERROR!
}
typename<std::enable_if_t<b == true>* = nullptr>
void func2() {}
Run Code Online (Sandbox Code Playgroud)
我不太擅长元编程。我想知道在这种情况下是否可能生成编译时错误。
使时间耦合变得明确:
func1返回一个应该由以下对象使用的类型func2:struct func1_result {
// Possibly constructors private, and friendship to `func1`.
//...
};
func1_result func1();
void func2(const func1_result&);
Run Code Online (Sandbox Code Playgroud)
func2所以你不能在没有先创建的情况下调用func1_result(由 返回func1)。
至少在极端情况下这是不可能的。查看以下代码(为scanf简洁起见,省略了标头和返回值测试):
int main() {
int code;
printf("Enter code value: ");
scanf("%d", &code);
if (code > 0) func1();
func2(); // has func1 be called ?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这里,即使是最好的静态分析工具也无法说明func1之前是否被调用func2,因为它取决于一个只有在运行时才知道的值。好吧,这是一个相当愚蠢的示例,但现实世界的程序经常在运行时读取其配置数据,并且该配置甚至可以更改其初始化的一部分。