Невозможно выполнить typedef ни для CVOpenGLESTextureGetName, ни для CVOpenGLTextureGetName

У меня есть кроссплатформенный код в .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.

Не могут ли функции быть определенными по типу?
Можете ли вы предложить некоторые эксперименты?
Заранее спасибо.

1

Решение

Не могут ли функции быть определенными по типу?

Функции? Нет. функция типы Однако может быть псевдоним. Вы можете получить тип функции с помощью decltype оператор:

typedef decltype(CVOpenGLESTextureGetName) CVOpenGLPlatformTextureGetName;

А также CVOpenGLPlatformTextureGetName станет псевдонимом для GLuint(CVOpenGLESTexture), тип функции CVOpenGLESTextureGetName,

Это выше, конечно, не делает то, что вы хотите, так как я подозреваю, что вы просто хотите дать другое имя функции. Вы можете сделать это с constexpr указатель на это:

constexpr auto* CVOpenGLPlatformTextureGetName = &CVOpenGLESTextureGetName;

И это все. CVOpenGLPlatformTextureGetName будет оцениваться во время компиляции как «другое имя» для функции, с которой вы его инициализируете.

1

Другие решения

Других решений пока нет …