C++:默认参数和向量

Posted

技术标签:

【中文标题】C++:默认参数和向量【英文标题】:C++: Default Arguments and Vectors 【发布时间】:2012-08-06 16:19:55 【问题描述】:

在 C++ 中,我想要一个函数,它接受向量类型的可选参数。如果未提供参数,我希望变量的大小为 0。我目前有

void v_connect::import(vector<int> vid_,vector<double> vpos_,vector<int> vbd_,vector<int>    bd_ss_=std::vector<int>() )

但这不起作用。基本上,如果用户提供可选参数bd_ss_,我想做一个检查bd_ss_.size()!=0,然后做一些额外的事情。如果用户不提供参数,我想要bd_ss.size()==0。这可能吗?

【问题讨论】:

哇,你真的复制了所有这些向量?! const vector&lt;int&gt; &amp;vid_, ... 【参考方案1】:

没有办法判断可选参数是否是用户提供的。但是,您可以使用重载:

void v_connect::import(
    std::vector<int> vid_,
    std::vector<double> vpos_,
    std::vector<int> vbd_,
    std::vector<int> bd_ss_) 

    check(!bd_ss_.empty());
    do_extra_stuff();
    do_import(vid_, cpos_, vbd_, bd_ss_);


void v_connect::import(
    std::vector<int> vid_,
    std::vector<double> vpos_,
    std::vector<int> vbd_) 

    do_import(vid_, cpos_, vbd_, std::vector<int>());


// private:
void v_connect::do_import(
    std::vector<int> vid_,
    std::vector<double> vpos_,
    std::vector<int> vbd_,
    std::vector<int> bd_ss_)

    // common import code goes here

【讨论】:

【参考方案2】:

你可以让用户传递一个指针:

void foo(std::vector<int> * ov = NULL)

    std::vector<int> dummy;
    std::vector<int> & bd_ss_ = ov ? *ov : dummy;

    if (ov) assert(!bd_ss_.empty());

    // ...

或者,使用 Boost.optional,这是一个巧妙的 C++ 风格包装器,围绕这个想法,允许您通过无缝界面获得相同的行为。

【讨论】:

【参考方案3】:

可选参数放在标头中,而不是 cpp。

顺便说一句,您正在混合矢量和 std::vector,请使用其中一个(最好坚持使用 std::vector)。

【讨论】:

不是 100% 正确,每个参数都可以在标头或实现中默认(更准确地说:声明或定义),只要在默认参数时,签名中的所有后续参数都默认(或之前已违约)。无论如何 +1,因为这很可能是问题的原因。

以上是关于C++:默认参数和向量的主要内容,如果未能解决你的问题,请参考以下文章

C++核心编程中的函数-占位参数和默认参数

如何为函数中的向量参数提供默认值

C++ —— 函数默认参数

C++中关于属性向量的查询

初始化 C++ 向量的大小

调用 C++ 函数时指定默认参数