gpt4 book ai didi

c++ - 有没有办法通过函数指针调用运算符函数?

转载 作者:太空狗 更新时间:2023-10-29 23:03:36 27 4
gpt4 key购买 nike

This 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生成:

  • 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+},
    ...
    );

两者都不起作用。我也试过std::function<z3::expr(expr const&, z3::expr const)>作为 mapped_type,但仍然失败。

那么有没有什么办法可以把运算符函数当做一个变量,通过函数指针来调用呢?

最佳答案

foo 表示重载集时,

&foo 是一个问题。在任何大型程序中,operator+ 都会被重载。如果存在使用允许重载解析的 &foo 的上下文,例如将 &foo 分配给具有函数指针类型的变量,则可以解决该问题。该类型随后用于重载解析。

但是,在您的情况下,您需要填充 std::initializer_listoperator+ 的任何重载都可以在该列表中。

幸运的是,另一种情况也允许重载解析:强制转换。所以,

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

关于c++ - 有没有办法通过函数指针调用运算符函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25060324/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com