我想防止调用某些函数。我们先忽略通过函数指针什么的来调用函数的情况,只关注直接函数调用的情况。我可以用 = 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/

10-11 21:59
查看更多