믿을만한 몇몇 출처 (즉, 비공식 채널을 사용하는위원회 구성원)의 애매한 의견을 듣고 C 유형 일반 표현식을 C++에 추가 할 수 없으므로 막연한 의견을 들었습니다.C 유형 - 일반 표현식을 C++과 호환 할 수없는 이유는 무엇입니까?
내가 알 수있는 한, 타입 - generic 표현식은 C++ 템플릿과 오버로드에 비해 매우 제한적이지만 특별한 경우로 정의해야 할 상호 작용 가능성이 없습니다.
유형 일반 표현식은 제어 표현식과 유형 및 하위 표현식 간의 일련의 "연관"으로 구성됩니다. 하위 표현식은 제어 표현식의 정적 유형과 하위 표현식에 대해 나열된 유형에 따라 선택되며 TGE 대신에 대체됩니다. 매칭은 유형 호환성의 C 개념을 기반으로합니다.이 개념은 ODR (one-definition rule)에서 extern
연결을 사용하는 유형의 C++ ID와 동일합니다.
표현식을 제어하는 표현식 클래스가 C++에서 기본 클래스 연결을 선택하면 좋겠지 만 C에는 상속이 없으므로 호환성이 필요하지 않습니다. 이것은 어쨌든 걸림돌로 간주됩니까? 편집
:보다 구체적인 세부 사항에 관해서는, C11 이미 선택된 표현식의 값 범주 (좌변 다움을) 보존을 위해 제공하고, TGE는 상수 표현해야하는 것만큼 (의 무엇이든 카테고리) 모든 피연산자가 제어 식을 포함하여 있습니다. 이것은 아마도 C 언어 결함 일 것입니다. 어쨌든, C++ 14는 잠재적으로 평가 될 수있는 것에 대한 상수 표현을 정의하고, TGE 스펙은 비 선택된 하위 표현이 평가되지 않는다고 이미 말하고있다.
요점은 수술의 TGE 원리가 나중에 문제를 일으키지 않고 이식되기에 충분히 단순 해 보입니다. C++ TGE의는 C와 C++의 교회법을 극대화 제외하고, 유용 할 이유 에 관해서는
은, 그들은 본질적으로 static_if
, 산세 매우 논쟁적인 조건 선언의 기능을 구현하는 데 사용할 수 있습니다. 나는 static_if
의 지지자가 아니지만 "저기 있습니다."
template< typename t >
void f(t q) {
auto is_big = _Generic(std::integral_constant< bool, sizeof q >= 4 >(),
std::true_type: std::string("whatta whopper"),
std::false_type: "no big deal"
);
auto message = _Generic(t, double: "double", int: 42, default: t);
std::cout << message << " " << is_big << '\n';
}
제네릭 해결 책임자는 수업이 어떻게 작동하는지 알아야합니다. 따라서 클래스를 일반화 할 수 없으므로 일부 유형에서만 작동하는 기능을 사용할 수 있습니다. – leewz
@leewangzhong C에서와 똑같이 작동합니다.상속에 대한 통찰력이 아니라 모든 유형에서 작동합니다. – Potatoswatter
제발 generics가 해결 될 때까지는 C++ 타입이 인식되지 않을 수도 있습니다. – leewz