c语⾔中尖括号的作⽤,c–参数值的尖括号是什么,它⽤于哪些?这⾥有两个不同的因素.
⾸先,可以定义除了类型之外的参数化的模板.例如,这是⼀个简单的数组类型:
template struct Array {
T arr[N];
};
我们可以这样使⽤
Array myArray;
我们知道向量< int>和载体< double>是不同的类型.但是现在我们还必须指出,Array< int> 137>和Array< int,136>是不同的类型.
其次,使⽤模板时,编译器必须能够出所有模板参数的值.当您使⽤模板类时,这就是为什么通常指定所有模板参数的原因.例如,你不说⽮量x,⽽是说像向量< double> X.当使⽤模板功能时,⼤多数时候编译器可以弄清楚参数.例如,要使⽤std :: sort,你只需要说些什么
std::sort(v.begin(),v.end());
但是,你也可以写
std::sort::iterator>(v.begin(),v.end());
更明确但是有时候,你有⼀个模板功能,并不是所有的参数都可以计算出来.在你的例⼦中,我们有:
template
GenericDocument& Parse(const Ch* str) {
RAPIDJSON_ASSERT(!(parseFlags & kParseInsituFlag));
GenericStringStream s(str);
return ParseStream(s);
}
请注意,parseFlags模板参数不能仅从函数的参数推导出来.因此,要调⽤该函数,必须指定template参数,否则编译器⽆法确定.这就是为什么你会写这样的东西
Parse<0>(myString);
这⾥,0是⼀个模板参数(在编译时解析),myString是实际的参数(在运⾏时解析).
您实际上可以使⽤组合⼀些类型推断和⼀些显式类型参数的⽅法.例如,在Boost中,有⼀个函数lexical_cast可以进⾏字符串类型的转换.从⾮字符串类型转换为字符串类型的函数签名是
template
Target lexical_cast(const Source& arg);
在这⾥,如果你调⽤lexical_cast,编译器可以弄清楚Source是什么,但是如果没有⼀些提⽰,它就不能推导出Target.因此,要使⽤lexical_cast,你可以写⼀些类似的东西
std::string myString = boost::lexical_cast<:string>(toConvertToString);
更⼀般地说,编译器说你必须指定⼀些模板参数(可选的0),它将尝试推导出其余的模板参数.如果可以的话,太棒了!如果没有,这是⼀个编译时错误.使⽤这个,如果你愿意,你可以写⼀个类似的功能
template
void DoSomething(const TypeArgument& t) {
/* ... */
}
const的作用要调⽤这个函数,你必须像这样调⽤它:
DoSomething(otherArg);
在这⾥,这是因为您必须明确告诉编译器什么是IntArgument,但是编译器可以从参数类型中推导出TypeArgument到DoSomething.希望这可以帮助!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论