【问题标题】:C++: Default Arguments and VectorsC++:默认参数和向量
【发布时间】: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_, ...

标签: c++ function vector optional-parameters


【解决方案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,因为这很可能是问题的原因。
      猜你喜欢
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多