C++ 获取标准库函数地址的替代方案/可能的错误行为

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函数的函数指针安全?比

问题:获取标准库函数的地址可能会导致错误行为。。。见下面的例子。因此,我正在寻找一种替代方法,以获取标准库函数的地址

根据@Caleth在中的说明

“请注意,通过获取标准库函数(未指定可寻址)的地址,您依赖于未指定的(可能是格式错误的)行为”

如本例所示:

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');