用于定义类型的宏

时间:2015-12-17 03:52:31

标签: c++ c++11 build

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)

2 个答案:

答案 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