有没有一种方法可以通过函数指针来调用操作符函数?
Is there a way to call operator function through function pointers?
这个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) }
相关文章:
- QMetaObject invokeMethod的基于函数指针的语法
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- c++r值引用应用于函数指针
- 模板函数指针和lambda
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 带有类的函数指针
- () 函子后面的括号,而不是函数指针?
- 全局作用域中函数指针的赋值
- 使用"Task"函数指针队列定义作业管理器
- 将成员函数指针作为参数传递给模板方法
- 如何创建对象函数指针C++映射?
- 匹配函数指针作为模板参数?
- 通过函数指针定义类范围之外的方法
- 存储在类中的函数指针
- C++从函数指针数组调用函数
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 整数键映射到头文件中的成员函数指针
- 从类成员函数到类 C 函数指针的转换
- 如何将内联匿名函数分配给C++函数指针
- 将字符缓冲区强制转换为函数指针