0

对于这个项目,我不能使用 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);
}

我的问题是我要上****** WHAT GOES HERE? ******线什么?我会使用 std::bind 部分应用它(a la time_limit_parser(timeLimit)),但我不能在这个项目中使用 C++11。

4

1 回答 1

1

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);
}

显然,您需要更改 of 的定义processFunction以匹配对 的指针/引用BaseProcessor,并且它显然不如 usingbind或 lambdas 漂亮,但是如果您无法升级或获得提升,那么它的表现就差不多了巫术。

于 2014-04-20T17:57:31.300 回答