C++ 获取标准库函数地址的替代方案/可能的错误行为
问题:获取标准库函数的地址可能会导致错误行为。。。见下面的例子。因此,我正在寻找一种替代方法,以获取标准库函数的地址 根据@Caleth在中的说明 “请注意,通过获取标准库函数(未指定可寻址)的地址,您依赖于未指定的(可能是格式错误的)行为” 如本例所示:C++ 获取标准库函数地址的替代方案/可能的错误行为,c++,std,function-pointers,unsafe,C++,Std,Function Pointers,Unsafe,问题:获取标准库函数的地址可能会导致错误行为。。。见下面的例子。因此,我正在寻找一种替代方法,以获取标准库函数的地址 根据@Caleth在中的说明 “请注意,通过获取标准库函数(未指定可寻址)的地址,您依赖于未指定的(可能是格式错误的)行为” 如本例所示: int (*fun)(int) = std::toupper; int t = fun('x'); 我的问题是: 1) 是否没有安全的方法通过指针调用(在本例中)toupper 2) 静态_转换是否使指向std lib函数的函数指针安全?比
int (*fun)(int) = std::toupper;
int t = fun('x');
我的问题是:
1) 是否没有安全的方法通过指针调用(在本例中)toupper
2) 静态_转换是否使指向std lib函数的函数指针安全?比如:
int (*fun)(int) = static_cast<int(*)(int)>(std::toupper);
int t = fun('x');
是否没有安全的方法通过指针调用(在本例中)toupper
不是直接的,只是通过一个间接层次(见下文)
static_cast
是否使指向std lib函数的函数指针安全
不,它可以为一个特定的函数签名确定一个重载集,但这与是否允许您获取该函数的地址无关
是否有其他方法可以通过签名为int-fun(int)
还有一种选择,您可以将函数调用包装在两个lambda中。这只需对原始代码段进行少量更改:
bool choice = true;
int (*fun)(int);
if (choice)
fun = [](int ch){ return std::toupper(ch); };
else
fun = [](int ch){ return std::tolower(ch); };
int t = fun('x');
这很好,因为两个lambda都没有状态和相同的签名,所以它们隐式地转换为函数指针。@JeJo提出我自己的问题感觉很奇怪,但实际上……我不认为这是一个重复。这不仅关系到是否允许获取某个特定
std
函数的地址,而且还要求解决问题,不是吗@卢布格说得通。那么相关的。
bool choice = true;
int (*fun)(int);
if (choice)
fun = [](int ch){ return std::toupper(ch); };
else
fun = [](int ch){ return std::tolower(ch); };
int t = fun('x');