c – 参数值的尖括号是什么,它用于哪些?

c – 参数值的尖括号是什么,它用于哪些?,第1张

概述我习惯于用于指定类型的尖括号,作为参数: vector<int> vecOfInts ; 但在rapidjson年,有这样的代码: document.Parse<0>(json) ; document.Parse方法的签名是: template <unsigned parseFlags>GenericDocument& Parse(const Ch* str) { RAPIDJSON_A 我习惯于用于指定类型的尖括号,作为参数:
vector<int> vecOfInts ;

但在rapidjson年,有这样的代码:

document.Parse<0>(Json) ;

document.Parse方法的签名是:

template <unsigned parseFlags>Genericdocument& Parse(const Ch* str) {    RAPIDJsON_ASSERT(!(parseFlags & kParseInsituFlag));    GenericStringStream<EnCoding> s(str);    return ParseStream<parseFlags>(s);}

我不知道你可以在角括号内传递一个值 – 思想角括号用于单独的typenames.

这里的代码是什么,为什么他在尖括号中传递一个值?

这是一个好主意吗?什么时候?

解决方法 这里有两个不同的因素.

首先,可以定义除了类型之外的参数化的模板.例如,这是一个简单的数组类型:

template <typename T,size_t N> struct Array {    T arr[N];};

我们可以这样使用

Array<int,137> myArray;

我们知道向量< int>和载体< double>是不同的类型.但是现在我们还必须指出,Array< int> 137>和Array< int,136>是不同的类型.

其次,使用模板时,编译器必须能够找出所有模板参数的值.当您使用模板类时,这就是为什么通常指定所有模板参数的原因.例如,你不说矢量x,而是说像向量< double> X.当使用模板功能时,大多数时候编译器可以弄清楚参数.例如,要使用std :: sort,你只需要说些什么

std::sort(v.begin(),v.end());

但是,你也可以写

std::sort<vector<int>::iterator>(v.begin(),v.end());

更明确但是有时候,你有一个模板功能,并不是所有的参数都可以计算出来.在你的例子中,我们有:

template <unsigned parseFlags>Genericdocument& Parse(const Ch* str) {    RAPIDJsON_ASSERT(!(parseFlags & kParseInsituFlag));    GenericStringStream<EnCoding> s(str);    return ParseStream<parseFlags>(s);}

请注意,parseFlags模板参数不能仅从函数的参数推导出来.因此,要调用该函数,必须指定template参数,否则编译器无法确定.这就是为什么你会写这样的东西

Parse<0>(myString);

这里,0是一个模板参数(在编译时解析),myString是实际的参数(在运行时解析).

您实际上可以使用组合一些类型推断和一些显式类型参数的方法.例如,在Boost中,有一个函数lexical_cast可以进行字符串类型的转换.从非字符串类型转换为字符串类型的函数签名是

template <typename Target,typename Source>    Target lexical_cast(const Source& arg);

在这里,如果你调用lexical_cast,编译器可以弄清楚Source是什么,但是如果没有一些提示,它就不能推导出Target.因此,要使用lexical_cast,你可以写一些类似的东西

std::string myString = boost::lexical_cast<std::string>(toConvertToString);

更一般地说,编译器说你必须指定一些模板参数(可选的0),它将尝试推导出其余的模板参数.如果可以的话,太棒了!如果没有,这是一个编译时错误.使用这个,如果你愿意,你可以写一个类似的功能

template <int IntArgument,typename TypeArgment>    voID DoSomething(const TypeArgument& t) {       /* ... */}

要调用这个函数,你必须像这样调用它:

DoSomething<intArg>(otherArg);

在这里,这是因为您必须明确告诉编译器什么是IntArgument,但是编译器可以从参数类型中推导出TypeArgument到DoSomething.

希望这可以帮助!

总结

以上是内存溢出为你收集整理的c – 参数值的尖括号是什么,它用于哪些?全部内容,希望文章能够帮你解决c – 参数值的尖括号是什么,它用于哪些?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1235355.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存