나는 템플릿을 통해 정적 다형성을 사용하는 C++ 라이브러리에서 작업 중이다. 이 방법은 대상이 작은 스택이있는 임베디드 시스템이기 때문에 스택 용도로 저장하는 데는 구성원 함수 인 inline
이 유용 할 때가 많기 때문에이 방법으로 설계되었습니다.GCC의 typeof() 확장을 멤버 액세스로 결합
: 당신이 볼 수 있듯이
class DeviceThatUsesSPI<class SPI_BUS_TYPE> {
public:
class DeviceEvent : public Event<DeviceThatUsesSPI> {};
// and the rest of the device driver implementation, including
// the code that emits that event.
}
SomeSpecificGpioBus gpio_bus();
SoftwareSpiBus<typeof(gpio_bus)> spi_bus(&gpio_bus);
DeviceThatUsesSPI<typeof(spi_bus)> device(&spi_bus);
, 우리는 GCC typeof
사용 확장 연산자를 사용하여 완전 불쾌한 유형 이름 DeviceThatUsesSPI<SoftwareSpiBus<SomeSpecificGpioBus>>
을 반복 작성하는 것을 피하십시오. 이것은 오늘날까지 시도한 모든 곳의 매력처럼 작동했습니다. 이벤트를 나타내는 중첩 클래스에 액세스하려고 시도했습니다. 나의 현재의 예에서이 템플릿 특수화 구현 컴파일 타임 이벤트 핸들러 바인딩 :
typeof(device)::ExampleEvent event;
:
template<>
inline void event_handler<typeof(device)::ExampleEvent>(typeof(device) *emitter) {
// event handler implementation...
}
을하지만, 나는 또한 변수 선언의 훨씬 더 최소한의 예에서 이것을 시도했습니다
두 경우 모두 G ++은 구문 오류로 표현식을 구문 분석하지 못합니다. 이것은 표준 C++ 문법에서 식별자가 아닌 다른 것을 따르는 상황이없고 구문 분석기가 콜론을 만나면 유형을 첫 번째 부분을 역 추적하고 처리 할 수없는 상황이 아니기 때문이라고 가정합니다.
typeof
구조 어디서나 사용할 수있는 형식 정의 이름을 사용할 수 있습니다그러나 the GCC manual about
typeof
이 연산자에 대한 다음과 같은 약속을합니다. 예를 들어, 선언, 캐스트 또는sizeof
또는typeof
의 내부에서 사용할 수 있습니다. 나는 형식 정의 내 예에typeof
의 두 가지 용도를 교체 할 경우
은 G ++는 행복하다 :
typedef typeof(device) device_type;
template<>
inline void event_handler<device_type::ExampleEvent>(typeof(device) *emitter) {
// event handler implementation...
}
device_type::ExampleEvent event;
그래서이 컴파일러는 내가 의미 쓴하지만 문법 것과 좋은 것을 내 의심을 발전한다 내가 그것을 표현하는 것을 허락하지 않는다. typedef 간접 사용을 사용하면 작업 코드를 얻지 만이 라이브러리의 사용자에게 편의를 위해 이벤트 처리기 선언을 자체 포함하는 방법을 찾는 것이 좋습니다. 구문 상 모호성을 제거하기 위해 typeof
연산자를 작성하여 이벤트 선언을 한 줄로 만들 수있는 방법이 있습니까?
C++ 11에서는 컴파일러 확장 인'typeof' 대신'decltype'을 사용할 수 있습니다. – Nawaz
내 솔루션이 작동하는지 알려주십시오. 그렇지 않으면 삭제할 것입니다. – Nawaz