考慮以下程序。有沒有一種方法可以實現call()
函數,而不需要在所有的if
聲明中?隨意更改地圖的類型以找到解決方案。 call()
也應該拋出一個異常,如果參數數量不正確。 call()
的接口可以更改,但函數的名稱,參數數組的指針和參數的數量僅在運行時纔可知。從具有可變數字參數的函數的指針圖調用函數
#include <iostream>
#include <string>
#include <map>
#include <cmath>
#include <boost/any.hpp>
using namespace std;
typedef double(*PF1)(double);
typedef double(*PF2)(double, double);
typedef double(*PF3)(double, double, double);
map<string, boost::any> m = {
{"sin", static_cast<PF1> (std::sin)},
{"pow", static_cast<PF2> (std::pow)}
// other
};
double call(string name, double* args, int nargs) {
if (name == "sin" && nargs == 1)
return boost::any_cast<PF1>(m[name])(args[0]);
else if (name == "pow" && nargs == 2)
return boost::any_cast<PF2>(m[name])(args[0], args[1]);
// etc...
}
int main() {
double n[] = {1, 2, 3, 4, 5, 6};
int narg1 = 1, narg2 = 2; // known at runtime
double r = call("sin", n, narg1);
r = call("pow", n, narg2);
}
可變模板可能會有所幫助。 –
是的,我問他們如何幫助... – Martin
給他們一個嘗試,找出?! –