C ++中有没有办法根据预处理器标志定义类型?我有两个版本的库,一个是原生的,另一个是thirft的顶部。
两个版本具有完全相同的函数签名,但返回和参数类型除外。本机版本传递对象的指针,而thirft版本使用i64来表示指针。
我想知道是否有办法构建一个可以根据编译标志使用任何库的项目。例如:
//native
AType* obj = fun(AnotherType* another_obj)
//thirft
i64 obj = fun(i64 another_obj)
我想知道是否有类似这样的构造:
if native
X is Atype*
Y is AnotherType*
else
X is i64
Y is i64
end
//native
X obj = fun(Y another_obj)
//thirft
X obj = fun(Y another_obj)
答案 0 :(得分:5)
如果两个版本都能够使用相同的已知数据进行编译(因此您实际上并未在未使用它的版本中定义AnotherType
,但只是具有不同的功能签名)那么您可以使用std::conditional
:
using ActualType = std::conditional<IS_NATIVE, i64, AnotherType>::type;
否则你必须坚持使用复古的#if #else #endif
宏。
答案 1 :(得分:4)
你想要这样的东西:
#ifdef native
typedef Atype* X
typedef AnotherType* Y
#else
typedef i64 X
typedef i64 Y
#endif
如果native
始终设置为(非零或零值),则可以改为使用#if native
。