2012-08-06 56 views
0

在C++中,我想有一個函數,它需要一個類型爲vector的可選參數。如果沒有提供參數,我希望變量的大小爲0.我目前有C++:默認的參數和矢量

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。這可能嗎?

+4

它不起作用? – mfontanini 2012-08-06 16:22:52

+0

哇,你真的把所有這些載體的副本? 'const vector &vid_,...' – 2012-08-06 16:36:04

回答

9

無法判斷可選參數是否由用戶提供。但是,您可以使用過載:

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

可選參數放在標題中,而不是cpp。另外,你正在混合使用vector和std :: vector,使用其中一個或另一個(喜歡堅持std :: vector)。

+2

不是100%是真的,只要默認參數時,每個參數都可以在頭文件或實現中默認設置(更確切地說是聲明或定義)是默認的(或之前已經默認)。無論如何+1,因爲這很可能是問題的原因。 – 2012-08-06 16:27:29

4

你可以使用戶通過一個指針來代替:

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++ - 風格的包裝解決這個想法,可以讓你有一個無縫接口相同的行爲。