c++ - 带有可选参数的 boost 函数

标签 c++ function boost optional-parameters

我有一张 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/

相关文章:

c++ - WebRTC:导入错误:没有名为 gyp_chromium 的模块

c++ - 编写我自己的 iostream 实用程序类 : Is this a good idea?

function - Corona SDK - 我们如何将外部函数连接到 main.lua?

python - 为什么这个数组的值在作为参数传递给函数时会发生变化?

c++ - Boost日志不写入文件,怎么办?

c++ - 检索从中实例化类型的模板

r - 函数中找不到对象错误

c++ - 如何编写一个可控的随机数生成器?

multithreading - 在Boost线程上调用抽象函数,不会在interrupt_point中断

c++ - 为什么非常量引用不能绑定(bind)到临时对象?