gpt4 book ai didi

c++ - 禁止带有 `static_assert` 的函数

转载 作者:搜寻专家 更新时间:2023-10-30 23:54:51 24 4
gpt4 key购买 nike

我想阻止调用某些函数。我们先忽略通过函数指针之类的调用函数的情况,只关注直接调用函数的情况。我可以用 = delete 来做到这一点。但是,发出的诊断信息并不十分丰富。我考虑过使用 static_assert,您可以使用它提供自定义诊断消息。我在函数体内放置了一个 static_assert(false, ...) 语句,希望它在函数被调用时触发。然而,事实证明,即使未调用该函数,static_assert 也会失败。有什么建议吗?

补充说明:该功能被无条件禁止。因此,std::enable_if 不适用于此处。这样一个函数的动机是我想防止某些使用,否则可以通过重载解析很好地编译。所以我不能只删除该功能。 deprecated 不是我想要的。我想要编译错误,而不是警告。

最佳答案

我同意其他人的观点,你不应该使用 static_assert为此,将函数标记为已弃用。

static_assert ionic 在编译时发射。对于一个普通的函数,这是它被解析的时间,而不是它被调用的时间。对于 template但是,它是实例化的时间。所以你可以让你的函数成为 template像这样。

template <typename...>
struct always_false { static constexpr bool value = false; };

template <typename... Ts>
void
never_call_me(Ts&&...)
{
static_assert(always_false<Ts...>::value,
"You should have never called this function!");
}

如果typename...不适合你(因为函数重载),请尝试缩小范围以仅匹配你想要出错的内容。

这里使用的技巧是 always_false<Ts...>::value取决于类型参数 Ts...所以直到 template 才能对其进行评估被实例化。 (尽管我们可以清楚地看到它永远是 false 。)

关于c++ - 禁止带有 `static_assert` 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34745581/

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