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" 然后将“$

告诉我们不能在C/C++中解除某些内容的结构。例如:

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+
放入与类型相同的命名空间中(您应该这样做).So
static_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) }