括号运算符的重载

  • Post author:
  • Post category:其他


今天,读一段代码,发现了一段非常诡异的代码,我把它列在下面:

Bool TAppEncCfg::parseCfg( Int argc, Char* argv[] )
{
    po::Options opts;
  opts.addOptions()
  ("help", do_help, false, "this help text")
  ("c", po::parseConfigFile, "configuration file name")
  
  ("InputFile,i",     cfg_InputFile,     string(""), "original YUV input file name")
  ("BitstreamFile,b", cfg_BitstreamFile, string(""), "bitstream output file name")
  ("ReconFile,o",     cfg_ReconFile,     string(""), "reconstructed YUV output file name")
  ("LambdaModifier0,-LM0", m_adLambdaModifier[ 0 ], ( double )1.0, "Lambda modifier for temporal layer 0")
  ("LambdaModifier1,-LM1", m_adLambdaModifier[ 1 ], ( double )1.0, "Lambda modifier for temporal layer 1")
  ("LambdaModifier2,-LM2", m_adLambdaModifier[ 2 ], ( double )1.0, "Lambda modifier for temporal layer 2")
  ("LambdaModifier3,-LM3", m_adLambdaModifier[ 3 ], ( double )1.0, "Lambda modifier for temporal layer 3")
  ("SourceWidth,-wdt",      m_iSourceWidth,  0, "Source picture width")
  ("SourceHeight,-hgt",     m_iSourceHeight, 0, "Source picture height")
... ...
;
... ...
}

opts.addOptions()

(“help”, do_help, false, “this help text”)

(“c”, po::parseConfigFile, “configuration file name”)

… …

;

这么一段代码,令我百思不得其解,一个函数后面没有分号,还加了几个括号并列,在几个括号后面是分号。

查询源码发现addOptions()函数返回一个Options类的对象,而且在这个类里面重载了运算符()并且括号的返回值也是一个Options类的对象。查询《C++ primer》知道,有一种叫做函数对象的东东,就是在重载括号运算符的情况下,可以使用对象名+(参数)的方式来调用。于是做个试验的小程序:

Test.h

#ifndef _TESt2_H_
#define _TEST2_H_
#include <string>
class test
{
public:
	test(){}
	~test(){}
	
	test& operator ()(const std::string& _name,const std::string _dest = "")
	{
		name = _name;
		dest = _dest;
		return *this;
	}
	inline	std::string getName(){return name;}
	inline std::string getDest(){return dest;}
private:
	std::string name;
	std::string dest;
};

#endif

Test.cpp

#include "test2.h"


main.cpp

#include "test2.h"
#include <iostream>
int main()
{//.addoption()
	test Ctest;
	Ctest
	("1","a")	
	("2","b");//.operator ()	
	//("3","c");
	std::cout<<"name:"<<Ctest.getName()<<" dest:"<<Ctest.getDest()<<std::endl;
}


结果




版权声明:本文为smells2原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。