对于这个项目,我不能使用 C++11,也不能添加任何额外的依赖项(例如 Boost)。
我想要实现的是:
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);
}
我的问题是我应该在 ****** 上放什么?这里有什么? ******
行?我会使用 std::bind 来部分应用它(a la time_limit_parser(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);
}
显然您需要更改 processFunction
的定义匹配对 BaseProcessor
的指针/引用, 它显然不如使用 bind
漂亮或 lambda,但如果您无法升级或获得提升,那么即使没有一些严肃的魔法,它也会变得很好。
关于c++ - std::bind pre-C++11 的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23185697/