C++ 有没有办法通过函数指针调用运算符函数?
告诉我们不能在C/C++中解除某些内容的结构。例如:C++ 有没有办法通过函数指针调用运算符函数?,c++,pointers,macros,z3,C++,Pointers,Macros,Z3,告诉我们不能在C/C++中解除某些内容的结构。例如: int i = 1 TO_IDENTIFIER("+") 2; 无法扩展到 int i = 1 + 2; 所以我现在在考虑另一种选择: 保留一个映射,将“字符串文字”映射到“运算符函数”,然后调用相应的运算符 但我不知道是否有办法将operation函数放入std::map,因为operator+似乎不是变量的唯一名称 以下是我遇到的现实问题: 我有一个标记“$1+$2”,我可以将它们解析为字符串 "$1" "+" "$2" 然后将“$
int i = 1 TO_IDENTIFIER("+") 2;
无法扩展到
int i = 1 + 2;
所以我现在在考虑另一种选择:
保留一个映射
,将“字符串文字”映射到“运算符函数”,然后调用相应的运算符
但我不知道是否有办法将operation函数放入std::map
,因为operator+
似乎不是变量的唯一名称
以下是我遇到的现实问题:
我有一个标记“$1+$2”,我可以将它们解析为字符串
"$1" "+" "$2"
然后将“$1”
和“$2”
替换为类型均为z3::expr
的两个对象。我还需要用声明为以下内容的操作函数替换“+”
:
friend z3::expr operator+(z3::expr const & a, z3::expr const & b);
由于还有其他运算符,如
-
,&foo
表示重载集时,会出现问题。在任何规模较大的程序中,操作符+
都会过载。如果使用了允许重载解析的&foo
上下文,例如将&foo
赋值给函数指针类型的变量,则可以解决此问题。然后,该类型用于重载解析
然而,在您的情况下,您正在填充一个std::initializer\u列表
。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) }
typedef z3::expr(*myoperaty)(z3::expr const&a,z3::expr const&b);
#定义STR(var)#var
#定义z3Op(var)\
静态(运算符###var###(z3::expr const&a,z3::expr const&b))
#定义StrOpPair(var)\
{STR(var),z3Op(var)}
在成员函数指针之前使用&
。为了消除重载的歧义,可以强制转换(隐式或显式)。@chris但是根据它就像操作符+
,对吗?它如何解决我的问题?此外,还有其他运算符需要映射,如“&&”,因此这些基本函数是不够的。@Yakk这里没有成员函数;我只是对如何将操作符函数放入std::unordered_map
:-(@HongxuChen是一个具有固定参数集的操作符函数?static_cast(&Namespace::operator+)
感到困惑,假设您将类型的operator+
放入与类型相同的命名空间中(您应该这样做).Sostatic_cast(&z3::operator+)
。至少我认为应该这样做。谢谢,这似乎是答案。我发现我需要在命名空间z3中额外声明运算符+,然后一切都会好起来。谢谢你指出我应该使用std::initializer\u list
。我发现@Yakk可能是对的。而且,当concat时,似乎有一些问题e> 操作员
和+
;我不知道为什么,所以我添加了。
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+},
...
);
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) }