在c++中为传递的引用提供默认参数

having default arguments for passed references in C++

本文关键字:引用 默认 参数 c++      更新时间:2023-10-16

我有许多函数引用typedef 'd数据类型,如下所示:

typedef std::map<string, string> dict;
union ret_t{
    int i;
    long l;
    double d;
};
ret_t func1(char* bytes, dict &d){
    //blah blah
}
ret_t func2(char* bytes, dict &d){
    //blah blah 2
}

我还有一个处理程序函数的映射,使用boost::function定义如下:

std::map <int, boost::function< ret_t (char*, dict) > > handlers;

我定义了这一点,以便我使用的>100处理程序函数,我可以简单地读取一个键并调用handlers[key](bytes, d);并让我的函数执行,只需要3个if/else用于我的不同数据类型(知道我需要的数据类型是另一个问题,我不会进入。这与问题无关)。

我的问题是少数函数不使用字典,并且在处理程序之外的上下文中很有用(例如,准备好字节流并将其转换为长int的函数)。为了从没有预定义字典的上下文中调用此函数,我必须创建一个从未使用过的无用字典:

dict d;
func1(bytes, d);

或者我必须重写函数:

//previous definition
ret_t func1(char* bytes){
    //same blah blah as before
}

当我尝试使用默认参数(如NULL或空字典)定义它时,我得到一个编译器错误:

default argument for 'dict& d' has type 'dict {aka std::map<std::basic_string<char>, std::basic_string<char> >}'

是否有一种方法可以做我想要的,而不必完全重写我的代码来传递指针而不是引用?

对于那些不接受字典的函数,创建两个版本。一个不接受字典作为参数,一个接受,但只调用另一个,不带字典。前者用于所有直接调用,后者用于像其他接受字典的函数一样的分派。