C++ std::预C和#x2B的绑定替代方案+;11
对于这个项目,我不能使用C++11,也不能添加任何其他依赖项(例如Boost) 我试图实现的是:C++ std::预C和#x2B的绑定替代方案+;11,c++,std,c++03,stdbind,C++,Std,C++03,Stdbind,对于这个项目,我不能使用C++11,也不能添加任何其他依赖项(例如Boost) 我试图实现的是: typedef void (*processorFunction)(int numItems, std::string* items); class Files { public: Files() : m_KVSeparator('='), m_ListSeparator(',') {} ~Files() {} void ReadDataFile(std::string
typedef void (*processorFunction)(int numItems, std::string* items);
class Files
{
public:
Files() : m_KVSeparator('='), m_ListSeparator(',') {}
~Files() {}
void ReadDataFile(std::string filename, std::map<std::string, processorFunction> processorFunctions);
char m_KVSeparator;
char m_ListSeparator;
};
void Files::ReadDataFile(std::string filename, std::map<std::string, processorFunction> processorFunctions)
{
// The file parsing and choosing of the function omitted for brevity:
processorFunction processor = ...;
int numItems = ...;
std::string* items = ...;
processor(numItems, items);
}
// Example parser:
void time_limit_parser(int& timeLimit, int numItems, std::string* items)
{
timeLimit = atoi(items[0].c_str());
}
int main()
{
// Omitted getting the global file manager pointer
Files* files = ...;
std::map<std::string, processorFunction> configProcessorFunctions;
int timeLimit;
// ****** WHAT GOES HERE? ******
files->ReadDataFile("config.dat", configProcessorFunctions);
}
typedef void(*processorFunction)(整数,标准::字符串*项);
类文件
{
公众:
Files():m_kvselector('='),m_listselector(','){}
~Files(){}
void ReadDataFile(std::string文件名,std::map processorFunctions);
字符m_kv分离器;
字符m_列表分离器;
};
void Files::ReadDataFile(std::string filename,std::map processor函数)
{
//为简洁起见,省略了文件解析和函数选择:
处理器函数处理器=。。。;
int numItems=。。。;
标准::字符串*项=。。。;
处理器(数量、项目);
}
//示例解析器:
无效时间限制解析器(int和timeLimit、int numItems、std::string*项)
{
timeLimit=atoi(项目[0].c_str());
}
int main()
{
//忽略获取全局文件管理器指针
文件*文件=。。。;
映射配置处理器函数;
国际时限;
//*********这里有什么******
文件->读取数据文件(“config.dat”,configProcessorFunctions);
}
我的问题是我应该在
*******上写些什么?这里是什么******代码>行?我会使用std::bind来部分应用它(一个latime\u limit\u解析器(timeLimit)
),但我不能在这个项目中使用C++11。即使使用bind
也不能做你想做的事情,因为bind
不返回函数指针。相反,您必须使用std::function
模板来包装它们
事实证明,没有什么能阻止你自己去做
struct BaseProcessor
{
virtual void operator()(int numItems, std::string* items) = 0;
};
struct TimeLimitParser : public BaseProcessor
{
int& timeLimit;
TimeLimitParser(int& limit)
: timeLimit(limit)
{}
virtual void operator()(int numItems, std::string* items)
{
time_limit_parser(timeLimit, numItems, items);
}
};
int main()
{
// Omitted getting the global file manager pointer
Files* files = ...;
std::map<std::string, processorFunction*> configProcessorFunctions;
int timeLimit;
TimeLimitParser parser(timeLimit);
configProcessorFunctions["foo"] = &parser;
files->ReadDataFile("config.dat", configProcessorFunctions);
}
struct BaseProcessor
{
虚拟void操作符()(int numItems,std::string*items)=0;
};
结构TimeLimitPasser:公共BaseProcessor
{
国际和时间限制;
TimeLimitPasser(内部和限制)
:时限(限制)
{}
虚拟void运算符()(int numItems,std::string*items)
{
时间限制解析器(时间限制、数量限制、项目);
}
};
int main()
{
//忽略获取全局文件管理器指针
文件*文件=。。。;
映射配置处理器函数;
国际时限;
TimeLimitParser解析器(timeLimit);
configProcessorFunctions[“foo”]=&parser;
文件->读取数据文件(“config.dat”,configProcessorFunctions);
}
显然,您需要更改processFunction
的定义,以匹配指向BaseProcessor
的指针/引用,而且它显然不如使用bind
或lambdas那么漂亮,但是如果您不能升级或获得与之相当的boost,那么就不需要一些严肃的向导了。甚至在C++11之前,TR1已提供std::TR1::bind
。你有空吗?如果没有,那么即使您无法添加对Boost的依赖,您也可以将Boost的实现复制到您自己的项目中。另外值得注意的是,您当然可以编写此的模板版本,因此您只需为每个参数编写一个版本,而不是为每个类型的排列编写一个版本。据我所知,这也是boost版本的基本功能。