【发布时间】:2022-01-12 07:09:19
【问题描述】:
我正在开发一个 C++ 库,有两个函数:func1 和 func2。
如果开发人员在调用func2 之前忘记调用func1,我想生成一个编译时错误:
这样就可以了:
func1();
func2(); // OK
但这会失败:
func2(); // ERROR, you forget to call func1()
当然,很容易产生运行时错误,但我想产生一个编译时错误。
我已经尝试如下,但它不起作用,因为我无法修改 constexpr 变量:
static constexpr bool b {false};
void func1() {
b = true; // ERROR!
}
typename<std::enable_if_t<b == true>* = nullptr>
void func2() {}
我不太擅长元编程。我想知道在这种情况下是否有可能产生编译时错误。
【问题讨论】:
-
我不明白为什么人们一直在寻找语言解决方案来设计气味。如果功能如此耦合,为什么它们是分开的?
-
查看 constexpr 计数器是如何制作的(例如 this one)。第一个函数实例化一个包含友元函数定义的模板类,第二个函数检查该友元函数是否存在。
-
安顿下来,伙计。 StoryTeller 在这里提出的观点是,有一些真正的方法可以使用实际的语言结构来解决问题。您提出问题的方式是 XY 问题。
-
不,我们没有,老兄。参数化构造函数和单例已经使用了几十年,尽管外行人坚持反对。
-
这绝对是XY问题。在调用
func2()之前,您需要至少调用一次func1(),并相信让编译器诊断此类情况是解决方案。编译器不能做这样的事情,特别是如果func1()、func2()以及调用它们中的任何一个的函数位于不同的源文件中。相反,您需要重新设计func2(),以便它调用func1(),并在必要时跟踪它这样做的事实(这样可以避免在需要时再次调用func1())。更好的是,不要将func1()提供给其他代码。
标签: c++ templates metaprogramming enable-if