我试图编写一个名为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标准)的方式解决问题?
答案 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;
}