在C ++中具有传递引用的默认参数

时间:2012-12-31 19:05:10

标签: c++ pass-by-reference default-parameters

我有很多功能可以引用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;

我定义了这个,使用我正在使用的&gt; 100处理函数,我只需读取一个键并调用handlers[key](bytes, d);并让我的函数执行,只需要3个if / elses我的不同数据类型(知道我需要的数据类型是另一个我不会涉及的问题。这与问题无关)。这可以按预期工作。

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

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> >}'

有没有办法做我想要的,而不必完全重写我的代码来传递指针而不是引用?

1 个答案:

答案 0 :(得分:0)

对于那些不接受字典的函数,请创建两个版本。有一个不将字典作为参数,而是一个但只是在没有字典的情况下调用另一个字典。将前者用于所有直接调用,后者用于调度,就像其他带字典的函数一样。