编写EMPTY_OR宏需要一些帮助

时间:2014-04-13 13:32:51

标签: c++ macros c-preprocessor

我试图编写一个名为EMPTY_OR的宏,它将返回第一个参数,但如果它是空的,它将返回第二个参数。

这是我到目前为止所拥有的:

#include <iostream>

#define EMPTY_OR(x, y) ( (sizeof(#x) > sizeof("")) ? (x) : (y) )

#define TEST(x, y) EMPTY_OR(y, x)

using namespace std;

int main()
{
    int four = TEST(4, );
    int eight = TEST(4, 8);
    cout << "four: " << four << endl;
    cout << "eight: " << eight << endl;
    return 0;
}

它很接近,但它不起作用,因为main功能的第一行扩展到以下内容:

( (sizeof("") > sizeof("")) ? () : (4) )

条件永远不会成立,因此永远不会评估()。我不应该关心它,但编译器会这样做,它会显示错误。

如何以最直接,最符合标准(或至少符合MSVC标准)的方式解决问题?

2 个答案:

答案 0 :(得分:2)

如果我理解你正在尝试做什么,我会删除sizeof并检查字符串中的第一个字符是\0;

#define EMPTY_OR(x, y) ( #x[0] ? (x+0) : (y) )

答案 1 :(得分:0)

这是一个改编自this article且没有Boost的解决方案,可以解决任何我能想到的事情:

#define CAT(a, b) CAT_(a, b)
#define CAT_(a, b) a##b

#define IF(cond, t, f) CAT(IF_, cond)(t, f)
#define IF_1(t, f) t
#define IF_0(t, f) f

#define COMMA(x) ,

#define ARG3(a, b, c, ...) c
#define HAS_COMMA(x) ARG3(x, 1, 0,)

#define EMPTY(x) EMPTY_(HAS_COMMA(COMMA x ()))

#define EMPTY_(x) HAS_COMMA(CAT(EMPTY_, x))
#define EMPTY_1 ,

#define EMPTY_OR(x, y) IF(EMPTY(x), y, x)
#define TEST(x, y) EMPTY_OR(y, x)


#include <iostream>
using namespace std;

int main()
{
    int t = TEST(1==, ) 1;
    int f = TEST(1==, 0==) 1;
    cout << "t: " << t << endl;
    cout << "f: " << f << endl;
    return 0;
}