У меня есть кроссплатформенный код в .cpp
файл, который конвертирует CVPixelBuffer
в CVOpenGLESTextureRef/CVOpenGLTextureRef
, Делать CoreVideo
связанные функции кросс-платформенные, я делаю следующее в заголовочном файле:
#ifdef IOS_SHARED_SUPPORT
#import <OpenGLES/EAGL.h>
#import <CoreVideo/CoreVideo.h>
#import <CoreVideo/CVOpenGLESTexture.h>
#import <CoreVideo/CVOpenGLESTextureCache.h>
#endif // IOS_SHARED_SUPPORT
#ifdef MAC_SHARED_SUPPORT
#import <CoreVideo/CoreVideo.h>
#import <CoreVideo/CVOpenGLTexture.h>
#import <CoreVideo/CVOpenGLTextureCache.h>
#import <AppKit/AppKit.h>
#endif // MAC_SHARED_SUPPORT
#ifdef IOS_SHARED_SUPPORT
typedef CVOpenGLESTextureRef CVOpenGLPlatformTexture;
typedef CVOpenGLESTextureCacheRef CVOpenGLPlatformTextureCache;
typedef CVOpenGLESTextureGetName CVOpenGLPlatformTextureGetName; // error!!!
#endif
#ifdef MAC_SHARED_SUPPORT
typedef CVOpenGLTextureRef CVOpenGLPlatformTexture;
typedef CVOpenGLTextureCacheRef CVOpenGLPlatformTextureCache;
typedef CVOpenGLTextureGetName CVOpenGLPlatformTextureGetName; // error!!!
#endif
Это говорит «Неизвестное имя типа« CVOpenGLESTextureGetName »; вы имели в виду« CVOpenGLESTextureRef »?», несмотря на то что <CoreVideo/CVOpenGLESTexture.h>
включен, и CVOpenGLESTextureRef
можно использовать в typedef.
Не могут ли функции быть определенными по типу?
Можете ли вы предложить некоторые эксперименты?
Заранее спасибо.
Не могут ли функции быть определенными по типу?
Функции? Нет. функция типы Однако может быть псевдоним. Вы можете получить тип функции с помощью decltype
оператор:
typedef decltype(CVOpenGLESTextureGetName) CVOpenGLPlatformTextureGetName;
А также CVOpenGLPlatformTextureGetName
станет псевдонимом для GLuint(CVOpenGLESTexture)
, тип функции CVOpenGLESTextureGetName
,
Это выше, конечно, не делает то, что вы хотите, так как я подозреваю, что вы просто хотите дать другое имя функции. Вы можете сделать это с constexpr
указатель на это:
constexpr auto* CVOpenGLPlatformTextureGetName = &CVOpenGLESTextureGetName;
И это все. CVOpenGLPlatformTextureGetName
будет оцениваться во время компиляции как «другое имя» для функции, с которой вы его инициализируете.
Других решений пока нет …