gpt4 book ai didi

c++ - c++在编译时检查是否调用了函数

转载 作者:行者123 更新时间:2023-12-02 10:03:50 25 4
gpt4 key购买 nike

可能重复的内容我会在底部说明。

我想知道是否可以进行编译时检查,看看是否在另一个函数之前调用了一个函数。
我的用例看起来像这样:

auto f = foo();
if(!f.isOk())
return f.getError();

auto v = f.value();

因此,在这种情况下,如果用户未在调用value之前调用isOk,则我将希望获得编译时错误。
据我了解和搜索,这似乎是不可能的,但是我想在这里问一下,以确保我没有错过任何c++魔术。

FauxDupes:
How to check at compile time that a function may be called at compile time?
这是关于知道您的函数是否为constexpr函数。我想知道在调用另一个函数之前是否已经调用了一个函数。

最佳答案

如果不进行重大更改,就无法直接实现所需的功能。

您可以执行的操作是通过将它们包装在单个调用中来始终强制调用它们:

??? foo(const F& f) {
return f.isOk() ? f.value() : f.getError();
}

但是,这只是将问题转移到选择返回类型上。您可以返回一个 std::variant或对设计进行一些更改的 std::optional,但是无论您做什么,它都将留给调用方检查实际返回的内容。

不要以为最愚蠢的用户,也不要试图保护他们避免任何可能的错误。相反,假设他们确实阅读了文档。

必须检查返回的值是否有效是一种很常见的模式:返回指针的函数可以返回空指针,返回迭代器的函数可以返回 end迭代器。此类情况已得到充分记录,负责任的调用者将检查返回的值是否有效。

为了获得进一步的启发,我向您介绍 std::optional ,它是C++的一种非常现代的功能,它在很大程度上也依赖于用户知道他们在处理什么。

PS:就像一个反例一样,用户可能会编写如下代码,这使得使用当前设计在编译时无法进行所需的检查:
 int n;
std::cin >> n;
auto f = foo();
if(n > 10 && !f.isOk())
return f.getError();

auto v = f.value();

关于c++ - c++在编译时检查是否调用了函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61223082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com