2016-09-08 2 views
1

여기에서 몇 가지 해답을 보았지만 여기서는 적용되지 않을 수 있습니다. 나는 대부분 하나의 인수 (1)에 사용되는 (회원) 기능이 있습니다, 어쩌면 유형 string의 네 번째 인수에 따라 선택적으로C++ 옵션 std :: vector 인수 for function

const std::complex<double> Class::func(const std::complex<double> &x, \ 
             std::vector<double> &y = 0, \ 
             std::vector<double> &z = 0) const; 

내가 yz에 대한 싶습니다을 무엇인가 이런 식으로 : func( , , , const std::string &choice),하지만 하나의 인수 만 함수에 전달하고 다른 두 개는 사용하지 못하게합니다. 예를 들어, y을 전달하면, 그 선언은 이전에 func()을 호출하여 완료되어야합니다. z과 동일하지만,이 옵션을 사용하고 싶습니다. 함수가 수학 측면에서 약간 무겁고 필요가 없습니다. 필요없는 경우 두 개의 추가 벡터를 계산하는 부담을 가중시킬 수 있습니다. 이것이 가능한가?

+0

을 'std :: optional'이 있습니다. 그렇지 않으면'boost :: optional'이 있습니다. – NathanOliver

+0

참조 대신 포인터를 전달하고 기본값을 nullptr로 설정하십시오. 그런 다음 코드에 y! = nullptr 및 z! = nullptr이 있는지 확인하면 완료됩니다. 하나의 작은 경고, 당신은 그들을 위해 기본값을 가지고 있지 않으면 매개 변수를 가질 수 없을 것입니다. 그래서 문자열은 기본값을 가져야합니다. 그러나 더 작은 유형을 사용하면 덜 무겁게 만들 수 있습니다. –

+0

함수 내부에서 y 또는 z를 수정해야합니까? 다른 말로하면 y와 z는'const std :: vector & z' – log0

답변

4

를 사용하여 포인터와

+0

일종의 메모리 관리가 필요합니까? 'delete [] '또는 유사하게? –

+0

'new'가 없으면 어딘가에 '삭제'할 것이 없습니다. 당신은 오직'새로 만든'물건 만'삭제 '할 수 있습니다. –

+0

이 함수는 func'func (vec1, & vec2, & vec3)'를 호출하는 반면 vec2와 vec3은 로컬 변수가 아닙니다. 'new '로 할당 한 경우에만 – Hayt

1

는 그러나 std::vector의 사용을 감안할 때 ... 내가 여기를 기본값으로 한

const std::complex<double> Class::func(const std::complex<double> &x, \ 
             std::vector<double> *y = nullptr, \ 
             std::vector<double> *z = nullptr) const; 

..이 확인하는 nullptr을 통과하지만 선택 사항입니다, 무엇을합니까 "빈"vector 뜻? 이것은 당신이 요구하는 "선택적"값으로 사용될 수 있습니다.

원본 코드에 대한 몇 가지주의 사항; 'null'참조가 유효하지 않습니다. 즉 std::vector<double> &y = 0이 컴파일되지 않습니다. 포인터를 그 자리에서 사용할 수 있습니다. 즉, 할당이 필요하다는 의미는 아닙니다.

const std::complex<double> Class::func(
    const std::complex<double> &x, 
    std::vector<double>* y = nullptr, 
    std::vector<double>* z = nullptr) const; 

함수 오버로드는 종종 다음과 같은 상황에 대한 대답입니다. 또한 std::optional 있습니다

const std::complex<double> Class::func(
    const std::complex<double> &x) const; 
const std::complex<double> Class::func(
    const std::complex<double> &x, 
    std::vector<double>& y) const; 
const std::complex<double> Class::func(
    const std::complex<double> &x, 
    std::vector<double>& y, 
    std::vector<double>& z) const; 

함수의 내부는 ... 최종 구현을위한 각각 연기한다.

const std::complex<double> Class::func(
    const std::complex<double> &x, 
    std::optional<std::vector<double>> &y, 
    std::optional<std::vector<double>> &z) const; 

표준 라이브러리에서 사용할 수없는 경우 boost::optional도 있습니다.

+0

매개 변수의 의도 된 사용법 인'std :: vector '을'std :: optional'에 대한 참조로 변환 할 수 있습니까? 나는 그렇게 믿지 않는다. –

+0

호출자와 호출자가 '벡터'를 만드는 방법에 따라 다릅니다. 그것이 ('optional'에서) 제자리에 생성되면, 비슷한 의미가 유지됩니다. 선택 사항 바깥에서 작성한 경우 예, 사본이 작성됩니다. – Niall

+0

이것도 작동합니까? 임시가 아닌 참조를 전달하고 있습니다. 어쩌면 _ 선택적인 _ 대신에 _ 선택적인 참조 _? –

1

참조는 선택하지 않을 수 있지만 대신 포인터를 사용하고 기본값으로 nullptr을 사용해야합니다 당신이 복사 작업에 대한 염려되는 경우 boost::optional<>

라는 것이 있습니다.

당신은 또한 당신이 그냥 다른 기능을 추가 래퍼 함수

를 작성할 수 끝에 문자열에 의존 확인하려면 : 당신이 당신의 컴파일러는 이미 그것을 가지고 기다릴 수있는 경우에 잘

const std::complex<double> Class::func(
    const std::complex<double> &x, 
    std::string str, 
    std::vector<double> *y = nullptr, 
    std::vector<double> *z = nullptr) const 
{ 
    if(str == ...) 
     return func(....); 
    else 
     return func(....); //different call 
} 
+1

* 대안으로 emtpy 벡터를 디폴트로 사용할 수 있습니다 ... y = {} ... *는'const '로만 작동하며 OP는 옵션 벡터를 수정해야합니다. – NathanOliver

+0

아, 못 봤어. 나는 그 부분을 제거했다. – Hayt

관련 문제