我有一张 map ,其中包含 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) 将代码逐字复制到另一个不处理字典的函数中。不需要这个参数。
上面的代码是我正在做的事情的简化示例。
最佳答案
简短的回答:如果没有大量额外的代码,这在 C++ 中是不可能的。
长答案:
C++ 中函数参数的默认值仅在出现函数名称的上下文中需要时使用。如果您通过其他方式(例如函数指针或 boost::function/std::function )调用函数,则编译器无法获得有关可能存在默认参数的信息,因此它可以不会为您填写。
作为背景,这就是默认参数在 C++ 中的工作方式:
当您有表达式 substring(MyString)
(使用 std::string MyString = "something"
)时,编译器会查找所有名为 substring
的函数code> 并找到 string substring(string, int=0)
。该函数采用两个参数,其中之一可以有默认值,这使得该函数可行。为了实际调用该函数,编译器会更改源代码,以便读取 substring(MyString, 0)
并根据该调整生成代码。
为了能够通过间接调用(例如通过 boost::function
)使用默认值,您实际上必须模拟编译器的默认参数机制。
关于c++ - 带有可选参数的 boost 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14124797/