今天,读一段代码,发现了一段非常诡异的代码,我把它列在下面:
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 版权协议,转载请附上原文出处链接和本声明。