今天看到一段函数,如下:
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