請告訴我以下列方式呼叫數學函式是否安全:
map<string,double(*)<double> func_map = { {"sin", &std::sin } ... }
...
double arg = 2.9;
double res = func_map["sin"](arg);
uj5u.com熱心網友回復:
獲取標準庫中不在指定可尋址函式串列中的函式地址會導致未指定的行為(至少從 C 20 開始)。std::sin并且其他<cmath>函式不在該串列中,因此,為了安全起見,將它們包裝在仿函式中,例如 lambda:
#include <cmath>
#include <map>
#include <string>
int main() {
std::map<std::string, double(*)(double)> func_map = {
{"sin", [](double x) { return std::sin(x); }},
{"cos", [](double x) { return std::cos(x); }},
};
}
通過以下方式呼叫數學函式是否安全:
double res = func_map["sin"](arg);
不,如果您要呼叫的函式不存在于 中func_map,則使用下標operator[]將首先在地圖中插入一個double(*)(double)指向,nullptr然后將其回傳nullptr。呼叫nullptr(arg)會導致未定義的行為。為了安全起見,您可以做幾件事:
- 使
func_mapconst. 這可以防止您使用任何可能在地圖中插入某些內容的函式,例如下標運算子。 - 如果地圖中不存在該函式,則用于
func_map.at("sin")(arg);獲取例外 ( )。std::out_of_range您可以安全地捕獲它并向用戶列印一條訊息:try { double res = func_map.at("sin")(arg); std::cout << res << '\n'; } catch (const std::out_of_range& ex) { std::cout << "unknown function\n"; } - 如果您不希望未知函式出現例外,則可以改用成員函式
find:if(auto fit = func_map.find("sin"); fit != func_map.end()) { double res = fit->second(arg); std::cout << res << '\n'; } else { std::cout << "unknown function\n"; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/480084.html
上一篇:React-計算圓中的點位置
下一篇:使用python從網站中提取資訊
