【问题标题】:Function Pointer of an Operator in C++C++中运算符的函数指针
【发布时间】:2013-06-25 14:23:40
【问题描述】:

所以我有一个函数,它需要一个函数指针作为输入,它的原型是这样的:

int function(int (*op)(int, int));

我想知道是否可以为该函数指针传递一个运算符。特别是这个内置运算符:

int operator|(int, int);

我试过了:

function(&(operator|));

并得到了这种错误:

error: no matching function for call to 'function(<unresolved overloaded function type>)'

我试过了:

function(&(operator|(int, int)));

并得到了这种错误:

error: expected primary-expression before 'int'

我在文档中寻找过这种情况,但我得到的是关于“地址”运算符 (operator&) 的信息,而不是关于运算符地址的信息......

编辑:

查看上一个问题 Calling primitive operator-functions explicitly in C++

【问题讨论】:

  • 在函数调用中消除&amp; 有效吗?
  • @SuvP 为什么要这样?该函数不存在,因此无法获取其地址。
  • @JamesKanze 我以为他超载了。
  • @SuvP 他不能。除非至少有一个操作数是用户定义的类型,否则不能重载运算符。

标签: c++ operators function-pointers


【解决方案1】:

内置运算符 |这需要两个 int 并返回一个 int 不能通过符号 operator| 访问。例如,以下不编译

int a = operator|(2,3);

【讨论】:

  • 那是因为该函数不存在。内置运算符不是函数,即使它们的行为就像是用于重载解析。
  • 所以,基本上,我需要创建一个函数包装器... int OR(int a, int b){return a|b;}
  • @Ned:是的,这行得通。使用 C++11,您还可以将函数指针替换为 std::function&lt;int(int,int)&gt; 并传递 lambda 表达式。
  • @user763305 一旦变成std::function,也可以使用std::bit_or
  • @Ned 不要称它为OR——传统上所有大写字母都表示宏。不要称它为or,它映射到||
【解决方案2】:

由于运算符不能作为函数使用,标准提供了一系列与运算符对应的函子。其中最著名的是std::less,它是排序、集合和映射的默认模板参数。

完整列表可在functional 标头中找到。最接近您要求的是std::bit_or

不幸的是,这些是作为带有operator() 而不是函数的模板类实现的,因此它们不适合您的特定用例。它们更适合模板。

【讨论】:

    猜你喜欢
    • 2014-12-24
    • 2011-05-09
    • 2012-05-01
    • 2010-09-20
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    相关资源
    最近更新 更多