Program Tip

C ++ 11의 모든 / 대부분의 setter 함수를 범용 참조를 허용하는 함수 템플릿으로 작성해야합니까?

programtip 2020. 11. 25. 08:20
반응형

C ++ 11의 모든 / 대부분의 setter 함수를 범용 참조를 허용하는 함수 템플릿으로 작성해야합니까?


멤버 변수, 복사 가능이동 가능 유형 각각 해당하는 setter 함수가 있는 클래스 X고려하십시오 . C ++ 98에서의 정의는 다음과 같습니다.NNX

class X
{
public:
    void set_a(A const& a) { _a = a; }
    void set_b(B const& b) { _b = b; }
    ...
private:
    A _a;
    B _b;
    ...
};

X클래스의 Setter 함수는 lvalue 및 rvalue 인수 모두에 바인딩 할 수 있습니다. 실제 인수에 따라이 임시의 생성 결과 및 것입니다 결국 복사 할당 될; 이로 인해 복사 할 수없는 유형은이 디자인에서 지원되지 않습니다.

C ++ 11을 사용하면 이동 의미론, 완벽한 전달 및 범용 참조 (Scott Meyers의 용어)가 있습니다. 이렇게하면 setter 함수를 다음과 같이 다시 작성하여보다 효율적이고 일반화 된 사용이 가능합니다.

class X
{
public:
    template<typename T>
    void set_a(T&& a) { _a = std::forward<T>(a); }

    template<typename T>
    void set_b(T&& b) { _b = std::forward<T>(b); }
    ...
private:
    A _a;
    B _b;
    ...
};

범용 참조는 const/ non- const, volatile/ non- volatile및 일반적으로 모든 변환 가능한 유형에 바인딩 할 수 있으므로 임시 생성을 방지하고 값을 operator =. 비 복제 가능은 , 이동 유형이 지원됩니다. 아마도 원하지 않는 바인딩을 통해서 제거 할 수 static_assert또는 통해 std::enable_if.

그래서 내 질문은 : 디자인 지침 으로서 C ++ 11의 모든 (대부분의) setter 함수는 범용 참조를 허용하는 함수 템플릿으로 작성되어야합니까?

더 성가신 구문과 이러한 setter 함수에서 코드를 작성할 때 Intellisense와 같은 도우미 도구를 사용할 수 없다는 점을 제외하고, " 가능할 때마다 범용 참조를 허용하는 함수 템플릿으로 setter 함수를 작성합니다 "라는 가설 원칙과 관련된 단점이 있습니까?


클래스 A와 B를 알고 있으므로 이동 가능한지 여부와이 디자인이 궁극적으로 필요한지 여부를 알 수 있습니다. 와 같은 std::string경우 여기에 성능 문제가 있다는 것을 알지 못하면 기존 코드를 변경하는 데 시간이 낭비됩니다. 을 (를) 다루고 있다면을 ( auto_ptr를) 뜯어 내서 사용할 때 unique_ptr입니다.

다음 과 같이 더 구체적인 것을 모르는 경우 값별로 인수를 취하는 것이 일반적으로 선호 됩니다.

void set_a(A a) { _a = std::move(a); }

이것은 A이동성 외에는 아무것도 요구하지 않고 의 생성자 중 하나를 사용할 수있게 해주 며 비교적 직관적 인 인터페이스를 제공합니다.

참고 URL : https://stackoverflow.com/questions/14197526/should-all-most-setter-functions-in-c11-be-written-as-function-templates-accep

반응형