This Q&A告诉我们不能在C / C ++中解组。例如:
int i = 1 TO_IDENTIFIER("+") 2;
无法扩展到
int i = 1 + 2;
所以我现在正考虑另一种选择:
保留一个{“1}},将”字符串文字“映射到”运算符函数“,然后调用相应的运算符。
但我不知道是否有办法将操作函数放入map
,因为似乎std::map
不是作为变量的唯一名称。
以下是我遇到的现实问题:
我有一个标记“$ 1 + $ 2”,我可以将它们解析为字符串
operator+
然后将"$1" "+" "$2"
和"$1"
替换为两个类型均为"$2"
的对象。我还需要将z3::expr
替换为声明为的操作函数:
"+"
由于还有其他运营商,例如friend z3::expr operator+(z3::expr const & a, z3::expr const & b);
,-
,我希望这可以自动完成。
首先,我定义一个与运算符对应的类型:
<
然后生成typedef z3::expr (*MyOperatorTy)(z3::expr const &a, z3::expr const &b);
:
在地图中显示类型信息:
std::unordered_map
没有类型信息(就像普通的函数变量一样)
std::unordered_map<std::string, MyOperatorTy> strOpMap (
{"+", z3::expr operator+(z3::expr const & a, z3::expr const & b)},
...
);
两者都不起作用。我还尝试std::unordered_map<std::string, MyOperatorTy> strOpMap (
{"+", operator+},
...
);
作为mapped_type,但仍然失败。
那么有没有办法将运算符函数视为变量并通过函数指针调用?
答案 0 :(得分:1)
&foo
表示重载集时, foo
是一个问题。在任何规模较大的程序中,operator+
都会超载。如果存在允许重载解析的&foo
的上下文,例如将&foo
赋值给具有函数指针类型的变量,则可以解决该问题。然后该类型用于重载解析。
但是,在您的情况下,您要填充std::initializer_list
。 operator+
的任何重载都可以在该列表中。
幸运的是,另一种情况也允许重载解析:一个演员。所以,
typedef z3::expr (*MyOperatorTy)(z3::expr const &a, z3::expr const &b);
#define STR(var) #var
#define z3Op(var) \
static_cast<MyOperatorTy> (operator##var## (z3::expr const &a, z3::expr const &b))
#define StrOpPair(var) \
{ STR(var), z3Op(var) }