C ++에서 C 스타일 이니셜 라이저는 생성자로 대체되어 컴파일 시간에 따라 유효한 초기화 만 수행되도록 할 수 있습니다 (초기화 후 객체 멤버가 일관됨).
모범 사례이지만 때로는 예와 같이 사전 초기화가 편리합니다. OOP는이를 추상 클래스 또는 창작 디자인 패턴으로 해결합니다 .
내 생각에,이 안전한 방법을 사용하면 단순함이 사라지고 간결한 코드는 유지 관리하기 위해 정교한 디자인이 필요하지 않기 때문에 때로는 보안 상충 관계가 너무 비쌀 수 있습니다.
대안 솔루션으로, 람다를 사용하여 매크로를 정의하여 C 스타일처럼 보이도록 초기화를 단순화하는 것이 좋습니다.
struct address {
int street_no;
const char *street_name;
const char *city;
const char *prov;
const char *postal_code;
};
#define ADDRESS_OPEN [] { address _={};
#define ADDRESS_CLOSE ; return _; }()
#define ADDRESS(x) ADDRESS_OPEN x ADDRESS_CLOSE
ADDRESS 매크로가
[] { address _={}; /* definition... */ ; return _; }()
람다를 생성하고 호출합니다. 매크로 매개 변수도 쉼표로 구분되므로 이니셜 라이저를 대괄호로 묶고 다음과 같이 호출해야합니다.
address temp_address = ADDRESS(( _.city = "Hamilton", _.prov = "Ontario" ));
일반화 된 매크로 이니셜 라이저를 작성할 수도 있습니다.
#define INIT_OPEN(type) [] { type _={};
#define INIT_CLOSE ; return _; }()
#define INIT(type,x) INIT_OPEN(type) x INIT_CLOSE
그러나 전화는 약간 덜 아름답습니다
address temp_address = INIT(address,( _.city = "Hamilton", _.prov = "Ontario" ));
그러나 일반 INIT 매크로를 사용하여 ADDRESS 매크로를 쉽게 정의 할 수 있습니다.
#define ADDRESS(x) INIT(address,x)