当前位置:  开发笔记 > 编程语言 > 正文

C++中Deduce类型的模板类型

如何解决《C++中Deduce类型的模板类型》经验,为你挑选了2个好方法。

在为"迭代器"范围编写通用函数时,我通常会这样做:

template  auto func(Iter &first, Iter &last)
{
    using IterType = typename std::decay::type;
    ...
}

另一种方式似乎是:

template  auto func(Iter &first, Iter &last)
{
    using IterType = typename std::iterator_traits::value_type;
    ...
}

而第三个:

template  auto func(Iter &first, Iter &last)
{
    using IterType = typename Iter::value_type;
    ...
}

没有申请iterator_traits.

从理论上讲,我的函数应该只接收迭代器,first并且last第二种形式理想地(imho)是获得该类型的最惯用的方式.但是使用typename std::decay::type最通用的习惯用语是为了不对限定Iter喜欢value_type定义?



1> 小智..:

第二个是最惯用的.

第一个不适用于代理(std :: vector )

第三个不适用于指针.



2> Nir Friedman..:

这些都不是非常惯用的; 你应该按值传递迭代器,而不是通过引用.这是gcc 4.9中for_each的签名:

template
_Function
for_each(_InputIterator __first, _InputIterator __last, _Function __f)

正如您所看到的,它是通过价值传递的.您的功能将不适用于惯用法:

func(v.begin(), v.end()); // error, binding non-const ref to rvalue!

此外,通过iterator_traits不仅仅是惯用,它基本上是必需的.就STL而言,这种typedef仅通过iterator_traits定义:http://en.cppreference.com/w/cpp/concept/ForwardIterator.iterator_traits为泛型情况提供了合理的默认值,但它可以专门(就像指针一样)执行不同的操作.不通过iterator_traits基本上意味着有人可以编写一个兼容的迭代器,它可以使用STL而不是你的代码.

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有