2012-08-06 3 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

+0

와우, 당신은 정말로 그 모든 벡터의 복사본을 가져 가고 있습니까?! 'const vector & vid_, ...' –

답변

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

인수가 기본값이 될 때까지 각 인수는 헤더 또는 구현 (더 정확하게는 선언 또는 정의)에 기본값으로 설정 될 수 있습니다. 서명의 모든 이후 인수 기본값으로 설정되거나 이전에 기본값으로 설정되었습니다. +1이 어쨌든 문제의 원인 일 가능성이 큽니다. –

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()); 

    // ... 
} 

가 또는 영리한 C++입니다 Boost.optional 사용 -이 아이디어 주위 스타일의 래퍼를하고 원활한 인터페이스와 같은 동작을 할 수 있습니다.