- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
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_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) }
关于c++ - 有没有办法通过函数指针调用运算符函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25060324/
我是一名优秀的程序员,十分优秀!