今天看到一段函数,如下:
std::string comm_done_filename(const std::string & base_done_filename, const int & job_id) { return base_done_filename + ".done." + IntToString(job_id); } std::string comm_avg_model_name(const std::string & base_model_filename, const int &count) { return base_model_filename + ".avg." + IntToString(count); }
隐约觉得可以用宏来解决, 因为函数名中的“done” 和“avg”,与返回值中包含的是相同的,而且两个函数形式完全一样,没有必要写成两个函数。
代码如下:
#define BT(name,flags,base,count) \ std::string comm_##flags##_##name (const std::string & base,const int & count) { \ return base + "."+ #flags + "." + IntToString(count); \ } BT(model_name,avg,kaka,akak) BT(filename,done,kaka,akak)
注意:函数名中的flags前后要有两个##, 而name只有前面有##,因为name之后没有东西了。
声名中kaka, akak是没有什么意义的,起个形参的作用。
调用的时候,当然可以直接用函数名:comm_done_filename,comm_avg_model_name。
另外,也可以使用函数指针数组或者用map。
首先,定义一个函数指针:
typedef std::string (*TransFun)(const std::string &, const int &);
函数指针数组如下:
TransFun fun[] = {comm_done_filename,comm_avg_model_name};
map如下:
map<string,TransFun> FunStrMap;
调用的时候当然是看不到函数名的:
string aa = FunStrMap["done"]("cheng",3); string AA = fun[0]("cheng",3);
不多说,整个代码如下:
#include <iostream> #include <string> #include <sstream> #include <map> using namespace std; std::string IntToString(const int &i) { std::stringstream ss; ss << i; return ss.str(); } #define BT(name,flags,base,count) \ std::string comm_##flags##_##name (const std::string & base,const int & count) { \ return base + "."+ #flags + "." + IntToString(count); \ } BT(model_name,avg,kaka,akak) BT(filename,done,kaka,akak) /* std::string comm_done_filename(const std::string & base_done_filename, const int & job_id) { return base_done_filename + ".done." + IntToString(job_id); } std::string comm_avg_model_name(const std::string & base_model_filename, const int &count) { return base_model_filename + ".avg." + IntToString(count); } */ typedef std::string (*TransFun)(const std::string &, const int &); int main(){ TransFun fun[] = {comm_done_filename,comm_avg_model_name}; map<string,TransFun> FunStrMap; FunStrMap["done"] = fun[0]; //FunStrMap["avg"] = fun[1]; FunStrMap.insert(pair<string,TransFun>("avg",fun[1]));//不同添加元素的方法 string aa = FunStrMap["done"]("cheng",3); string AA = fun[0]("cheng",3); string bb = FunStrMap["avg"]("yu",8); string BB = fun[1]("yu",8); cout<<aa<<"\n"<<bb<<endl; cout<<AA<<"\n"<<BB<<endl; return 0; }
输出结果:
cheng.done.3 yu.avg.8 cheng.done.3 yu.avg.8
总结一下知识点:
宏定义,函数指针,函数指针数组、map