c++ - std::bind pre-C++11 的替代方案

标签 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 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/

相关文章:

c++ - 我可能对 std::set 的工作感到困惑。我的代码不能正常工作

c++ - Qt 菜单栏不显示

c++ - 条件变量 wait_until timeout_time 过去了吗?

c++ - 指针在赋值前会占用内存吗?

C++ 销毁 allocator<string> 中的元素时是否会导致双重释放?

c++ - 按类属性(例如名称)搜索类对象的 std::vector

c++ - 如何使用 pair 遍历所有可能的字符对?

c++ - C++ 标准库上的 sizeof()

c++ - 如何在 GCC 为 C++03 的 CentOS 6 上部署 C++11 程序(具有依赖项)?

c++ - 使用 C++03 模拟 Variadic 模板时,我们可以在类中使用不同的代码吗?