有没有办法通过函数指针调用操作符函数?

时间:2014-07-31 13:38:06

标签: c++ pointers macros z3

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,但仍然失败。

那么有没有办法将运算符函数视为变量并通过函数指针调用?

1 个答案:

答案 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) }