双括号是什么?

3

刚遇到了这段代码:

if(iElement->getData().contains("someText") and iElement->getData()("someOtherText").toString() == "true")

让我困惑的是这个部分:
iElement->getData()("someOtherText").toString()

更精确地说,拥有:()()

我在任何地方都没有看到过重载运算符。

顺便说一下,这应该是C++代码。编译和运行都很好。

由于我不知道要搜索什么,无法在任何地方找到任何信息...请问有人可以解释一下吗?


我认为函数调用运算符被调用在由iElement->getData()返回的对象上,例如:https://dev59.com/0VPTa4cB1Zd3GeqPimP7?noredirect=1&lq=1 - Venkatesh-Prasad Ranganath
4
@MarekR,正如M.M指出的(评论现已删除),这是有效的C++代码。https://en.cppreference.com/w/cpp/language/operator_alternative - Sebastian Hoffmann
你的标题有点误导人。方括号指的是 [],它们并没有真正涉及到你的问题。 - super
@super 关于括号的命名在不同地区可能有所不同,因此我不会认为这是误导性的。他们明确表示他们的意思是 () - alter_igel
@super 这些是方括号 :) - solarflare
2个回答

9
 iElement->getData()("someOtherText").toString()

按照以下顺序处理:

  1. 调用iElement->getData()

  2. getData()返回的对象上,使用参数"someOtherText"调用重载的调用运算符operator()

  3. operator()返回的对象上,调用toString()

注意,operator()不一定需要被重写。例如getData()也可以返回函数指针。


根据iElement的类型,还可能会调用operator->。 - 1201ProgramAlarm
“在 operator() 调用结果中使用参数“someOtherText”,即重载调用运算符”似乎表明您正在调用用户定义的运算符,但这并不一定是情况。 - Ayxan Haqverdili

0
关于()()的问题,第一对括号对应于调用iElement->getData()返回可调用对象,第二对括号表示使用字符串参数调用返回的可调用对象的operator(),并返回类型为String(在下面的源代码中,String有成员函数toString())。
对于我们的情况,我们声明:
function<String (string)> callableObject;

这个可调用对象被称为

callableObject(“callOperator or functionPointer or someOtherText”);

可调用对象可以使用调用运算符或函数指针(Sebastian Hoffmann和讨论中)以及其他结构进行构造(请参见getDataWithCallableObject()的源代码):

         1 函数对象
         1.1 函数对象
               CallOperatorStruct callOperatorStruct;
               callableObject = callOperatorStruct;
         1.2 Lambda表达式,命名Lambda表达式
               String str;
               callableObject = [](string s) { return str; };
               auto namedLambda = [](string s) { return str; };
               callableObject = namedLambda;
         2 函数
         2.1 自由函数
               callableObject = freeFunction;
         2.2 自由函数指针
               callableObject = &freeFunction
         2.3 成员函数
               callableObject = MemberFunctionStruct::staticMemberFunction;
         2.4 成员函数指针
               MemberFunctionStruct memberFunctionStruct;
               callableObject = bind (&MemberFunctionStruct::memberFunction, memberFunctionStruct, _1);
               callableObject = &MemberFunctionStruct::staticMemberFunction;

源代码

#include <functional>
#include <string>

using namespace std;
using namespace std::placeholders;

struct String {
  bool toString () {
    return "true";
  }
};

struct CallOperatorStruct {
  String operator()(string s) {
    return str;
  }

  String str;
};

struct Element {
  CallOperatorStruct& getData () {
    return data;
  }
  CallOperatorStruct data;

  static function<String (string)> getDataWithCallableObject ();
};

int main () {
  Element* iElement = new Element ();

  if (iElement->getData()("someOtherText").toString()){};

  if (iElement->getDataWithCallableObject()("someOtherText").toString()){};
}

String str;

struct MemberFunctionStruct {
  String memberFunction (string s) {
    return str;
  };

  static String staticMemberFunction(string s) {
    return str;
  };
};

String freeFunction (string s) {
  return str;
};

function<String (string)> Element::getDataWithCallableObject () {
  function<String (string)> callableObject;

  // 1 Function object
  // 1.1 Function object
  CallOperatorStruct callOperatorStruct;
  callableObject = callOperatorStruct;

  // 1.2 Lambda, named lambda
  callableObject = [](string s) { return str; };
  auto namedLambda = [](string s) { return str; };
  callableObject = namedLambda;

  // 2 Function
  // 2.1 Free function
  callableObject = freeFunction;

  // 2.2 Free function pointer
  callableObject = &freeFunction;

  // 2.3 Member function
  callableObject = MemberFunctionStruct::staticMemberFunction;

  // 2.4 Member function pointer
  MemberFunctionStruct memberFunctionObj;
  callableObject = bind (&MemberFunctionStruct::memberFunction, memberFunctionObj, _1);
  callableObject = &MemberFunctionStruct::staticMemberFunction;

  return callableObject;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接