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
之外的任何东西。非常感谢。