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<int> &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++:默认参数和向量的主要内容,如果未能解决你的问题,请参考以下文章