Lin*_*gxi 2 c++ static-assert compile-time deleted-functions c++11
我想阻止调用某些函数.让我们忽略通过函数指针或其他东西调用函数的情况,只关注直接函数调用的情况.我可以这样做= delete.但是,所发布的诊断信息并不充分.我考虑过使用static_assert,您可以使用它来提供自定义诊断消息.我static_assert(false, ...)在函数体中放置了一个语句,希望在调用函数时它会触发.但是,事实证明static_assert即使没有调用该函数也会失败.有什么建议?
附加说明:该功能无条件禁止.所以,std::enable_if这里不适用.这样一个函数的动机是我想要阻止某些使用,否则可以通过重载解析来编译.所以我不能只删除该功能.deprecated不是我想要的.我想要编译错误,而不是警告.
我同意其他人根本不应该使用static_assert此功能,而是将该功能标记为已弃用.
static_assert离子在编译时触发.对于普通函数,这是解析它的时间,而不是它被调用的时间.template然而,对于a 来说,它是实例化的时间.所以你可以让你的功能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!");
}
Run Code Online (Sandbox Code Playgroud)
如果typename...不适合您(因为函数已超载),请尝试将其缩小到仅匹配您想要出错的内容.
这里使用的技巧always_false<Ts...>::value取决于类型参数,Ts...因此在template实例化之前无法对其进行求值.(即使我们可以清楚地看到它将永远存在false.)