使用可选参数增强功能

时间:2013-01-02 15:42:17

标签: c++ function boost optional-parameters

我有一个包含boost::function值的地图,定义如下:

std::map <std::string, boost::function<std::string (std::string, int)> > handlers;

我们假设我定义了以下函数:

using namespace std;
string substring (string input, int index = 0){
    if (index <= 0){
        return input;
    }
    stringstream ss;
    for (int j = index; j<input.length(); j++){
        ss << input[j];
    }

    return ss.str();
}

我希望能够将它存储在处理程序映射中,但是使用它的可选参数。 boost有没有办法执行此操作?我看过boost::optional,但这似乎没有按照我的意愿行事。

修改

为了提供更多背景知识,有一些处理程序需要额外的参数,例如指向字典(typedef std::map < std::string, std::string > dictionary)或其他东西的指针,因为它们会对该字典进行更改。但是,大多数处理程序不会触及相关字典,但是,为了将它们全部存储在同一个映射中,它们都必须使用相同的参数(boost::function具有相同的模板)。目标是使不处理字典的函数完全可用,而不必A)创建字典仅用于传递它而不使用它或B)将代码逐字复制到另一个函数中不需要这个论点。

上面的代码是我正在做的事情的简化示例。

1 个答案:

答案 0 :(得分:2)

简短的回答:如果没有大量额外的代码,这在C ++中是不可能的。

答案很长:
C ++中函数参数的默认值仅在函数的 name 出现的上下文中需要时使用。如果通过其他方式调用函数(如函数指针或boost::function/std::function),编译器无法获得有关可能存在默认参数的信息,因此无法为您填写它们。

作为背景,这是默认参数在C ++中的工作方式:
当您使用表达式substring(MyString)(带std::string MyString = "something")时,编译器将查找名为substring的所有函数并查找string substring(string, int=0)。该函数有两个参数,其中一个参数可以有一个默认值,这使得函数可行。为了实际调用该函数,编译器会更改源代码,使其读取substring(MyString, 0)并继续根据该适配生成代码。

为了能够通过间接调用使用默认值,例如通过boost::function,您实际上必须模拟编译器的默认参数机制。