C ++ 11의 모든 / 대부분의 setter 함수를 범용 참조를 허용하는 함수 템플릿으로 작성해야합니까?
멤버 변수, 복사 가능 및 이동 가능 유형 각각 및 해당하는 setter 함수가 있는 클래스 X
를 고려하십시오 . C ++ 98에서의 정의는 다음과 같습니다.N
N
X
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
이동성 외에는 아무것도 요구하지 않고 의 생성자 중 하나를 사용할 수있게 해주 며 비교적 직관적 인 인터페이스를 제공합니다.
'Program Tip' 카테고리의 다른 글
추적 파일 열기 오류 : 해당 파일 또는 디렉토리가 없습니다. (2) (0) | 2020.11.25 |
---|---|
앱을 참조하지 않고 Blueprint 모델에서 Flask-SQLAlchemy 사용 (0) | 2020.11.25 |
jQuery 객체 병합 (0) | 2020.11.25 |
RAISERROR의 철자가 잘못된 이유는 무엇입니까? (0) | 2020.11.25 |
Colspan이 Angular 2에서 알려진 기본 속성이 아닌 이유는 무엇입니까? (0) | 2020.11.24 |