2013-12-23 3 views
9

믿을만한 몇몇 출처 (즉, 비공식 채널을 사용하는위원회 구성원)의 애매한 의견을 듣고 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'; 
} 
+0

제네릭 해결 책임자는 수업이 어떻게 작동하는지 알아야합니다. 따라서 클래스를 일반화 할 수 없으므로 일부 유형에서만 작동하는 기능을 사용할 수 있습니다. – leewz

+1

@leewangzhong C에서와 똑같이 작동합니다.상속에 대한 통찰력이 아니라 모든 유형에서 작동합니다. – Potatoswatter

+0

제발 generics가 해결 될 때까지는 C++ 타입이 인식되지 않을 수도 있습니다. – leewz

답변

1

"Can not be"가 너무 강하다. "가능한지 불확실한"가능성이 더 높습니다.

이 기능을 C++에 추가하려는 경우 기존 C++ 기능과의 모든 상호 작용을 포함하여 완전히 지정해야하며 그 중 많은 기능은 _Generic을 염두에두고 설계되었습니다. 예 : typeid은 C에 없지만 C++에서 작동해야합니다. _Generic 표현식을 constexpr으로 사용할 수 있습니까? 템플릿 매개 변수로? lvalue입니까? 주소를 가져 와서 함수 포인터에 할당하고 과부하 해결을 할 수 있습니까? 템플릿 인수 공제를 할 수 있습니까? auto과 함께 사용할 수 있습니까? 기타

또 다른 복잡성은 _Generic의 기본 유즈 케이스가 C++ 네임 스페이스와 잘 맞지 않는 매크로를 사용한다는 것입니다. acos 예의 예는 tgmath입니다. C++은 이미 C의 표준 매크로를 금지하고 함수가되도록 요구했지만 tgmath.h에서는 작동하지 않습니다.

+2

이 소리는 눈금처럼 보이며 상호 작용이 없는지 확인해야합니다. 아이디어는 하나의 서브 표현식이 선택되어 전체 표현식으로 대체된다는 것입니다. 이와 같이 당신이 언급 한 것들과 상호 작용할 여지가없는 것 같습니다. 'tgmath' 매크로에 관해서는 C++ 98 이후에 이미 오버로드 세트로 대체되었습니다. – Potatoswatter