有没有一种方法可以通过函数指针来调用操作符函数?

Is there a way to call operator function through function pointers?

本文关键字:函数 指针 调用操作符 可以通过 方法 一种 有没有      更新时间:2023-10-16

这个Q&A告诉我们在C/c++中不能取消字符串化。例如:

int i = 1 TO_IDENTIFIER("+") 2;

不能展开为

int i = 1 + 2;

所以我现在在考虑另一个选择:

保留一个map,将"字符串字面值"映射到"操作符函数",然后调用相应的操作符。

但是我不知道是否有办法将操作函数放入std::map中,因为operator+似乎不是一个唯一的名称作为变量。

下面是我遇到的现实问题:

我有一个标记"$1 + $2",我可以将它们解析为字符串

"$1" "+" "$2"

则将"$1""$2"替换为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:

  • 地图中有info类型:

    std::unordered_map<std::string, MyOperatorTy> strOpMap (
      {"+", z3::expr operator+(z3::expr const & a, z3::expr const & b)},
      ...
    );
    
  • 没有类型info(就像一个普通的函数变量)

    std::unordered_map<std::string, MyOperatorTy> strOpMap (
      {"+", operator+},
      ...
    );
    

既不工作。我也尝试了std::function<z3::expr(expr const&, z3::expr const)>作为mapped_type,但仍然失败。

那么是否有任何方法将操作符函数视为变量并通过函数指针调用?

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