需要一些帮助来编写EMPTY_OR宏

Need some help writing an EMPTY_OR macro

本文关键字:EMPTY OR 帮助      更新时间:2023-10-16

我正在尝试编写一个名为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)的方式来解决它?

如果我理解您要正确执行的操作,我会删除sizeof并检查字符串中的第一个字符是否为

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

这里有一个改编自本文的解决方案,没有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;
}