C++ 如何禁止函数指针参数为空值

C++ 如何禁止函数指针参数为空值,c++,C++,我有一个功能: void foo(int parm11, pointer to function) {…} 我想禁止使用第二个参数的NULL值调用它。换句话说,我想从编译器在下面的C++源代码中得到一个错误消息: foo(5, NULL); 您可以捕获显式(以及可转换为空指针常量的任何内容),因为它有自己的类型: void foo(int, pfunc_type); // Your function void foo(int, std::nullptr_t) = delete; // The

我有一个功能:

void foo(int parm11, pointer to function) {…}
我想禁止使用第二个参数的
NULL
值调用它。换句话说,我想从编译器在下面的C++源代码中得到一个错误消息:

foo(5, NULL);
您可以捕获显式(以及可转换为空指针常量的任何内容),因为它有自己的类型:

void foo(int, pfunc_type); // Your function
void foo(int, std::nullptr_t) = delete; // The "bad" overload
当然,一个确定的用户仍然可以传递一个空函数指针,他们只是不能直接为参数指定一个空指针常量


最好重新考虑指针,只使用函数引用。

考虑通过引用传递。你不能让编译器检查参数的值,只能检查其类型。@ChristianHackl经常发布的版本将使用命令行选项全局定义
NDEBUG
。@ChristianHackl是的,嗯,其他人不这样做,事实上,
assert
通常只在调试版本中启用。@ChristianHackl我不知道为什么有人希望生产代码终止,而不告诉用户发生了什么不好的事情并保存数据tbh。对于
NULL
这件事,同样,您可以添加一个删除的重载,以
int
(也可能是一个以
long
为单位的重载)。@Angew-可能是一个以
decltype(NULL)
为单位的重载?可以节省guessing@StoryTeller:使用
decltype(NULL)
有一个问题,但是-这意味着现在只能在实际定义了
NULL
的情况下使用该函数。不需要额外的重载来捕获NULL,NULL文本常量会隐式转换为
nullptr\t
,第一个建议已经涵盖了
nullptr
0
0ULL
,以及
NULL
@BenVoigt-真想不到。我的脑子被炸了,因为我从来没有考虑过为那个用例尝试除
nullptr
之外的任何东西。非常感谢。