【发布时间】:2018-05-04 17:15:44
【问题描述】:
我正在寻找解决方案,如何简化 C++ 代码。
一个类中有很多类似的方法,我需要在每个方法中检查 JSON 中的数据类型。复制+粘贴此块并仅更改所需的类型(在本例中为“字符串”)有点笨拙。我的原始和工作代码验证块如下所示
if(json_data_incomming.get("value").is<string>()){
__TRACE("argument type OK\n");
} else {
__ERROR("invalid type\n");
_result.rc = ERROR_CODE_INVALID_TYPE;
_req_done(&_result);
return;
}
我的目标是创建一些像这样的验证宏:
JSON_CHECK_TYPE(string)
或:
JSON_CHECK_TYPE(<string>)
我试图定义 concat 我的宏,如:
#define JSON_CHECK_TYPE(TYPE) if(json_data_incomming.get("value").is<##TYPE##>()){\
__TRACE("argument type OK\n");\
} else {\
__ERROR("invalid type\n");\
_result.rc = ERROR_CODE_INVALID_TYPE;\
_req_done(&_result);\
return;\
}
但没有成功 - 编译器返回错误:
错误:粘贴“
我做错了什么?
【问题讨论】:
-
真的有必要使用宏吗?可以用函数替换宏吗?
-
is<##TYPE##>->is<TYPE> -
在 C++ 中遇到语法问题时,您可能会想“我知道,我会用宏解决它!”现在你有两个问题。
-
以下划线后跟大写字母或包含双下划线的标识符为系统保留。
-
使用模板。