Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::预C和#x2B的绑定替代方案+;11_C++_Std_C++03_Stdbind - Fatal编程技术网

C++ std::预C和#x2B的绑定替代方案+;11

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

对于这个项目,我不能使用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);
}
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来部分应用它(一个la
time\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版本的基本功能。