C++定义函数参数类型为泛型Iterator为何无法自动推导
template\u0026lt;classI\u0026gt;void foo(Iterator begin,Iterator end)
X
================================
template\u0026lt;classI\u0026gt;void foo(I begin,I end)
O
【C++定义函数参数类型为泛型Iterator为何无法自动推导】 C++的template的类型推导基本上是解不了方程的。如果你要在I不是iterator的时候产生错误,你需要用concept(C++14),而不是enable_if等。
■网友
T::X中的I是不能推导的:很显然有可能有两个I不相同的实例都可以进行合法的推导。
■网友
我想出了一个勉强解决方案,由于Iterator作参数的函数一般都接受两个Iterator,一个begin一个end,所以我可以将begin类型设T,end类型设Iterator,这样就能自动推导了:#define Iterator typename std::enable_if\u0026lt;std::is_same\u0026lt;typename std::iterator_traits\u0026lt;T\u0026gt;::value_type,V\u0026gt;::value,T\u0026gt;::typetemplate \u0026lt;class V\u0026gt;struct Foo { template \u0026lt;class T\u0026gt; void foo(T begin,Iterator end) {for (auto it=begin;it!=end;++it) cout \u0026lt;\u0026lt; *it \u0026lt;\u0026lt; endl;}};int main() { vector\u0026lt;int\u0026gt; a{1,2,3,4}; auto b=Foo\u0026lt;int\u0026gt;(a); b.foo(a.begin(),a.end());//不报错鸟}
或者只接受一个Iterator参数,也可以在函数中定义一个用不到的类型让编译器去检查:template \u0026lt;class V\u0026gt;struct Foo { template \u0026lt;class T\u0026gt; void bar(T begin,T end) { typedef typename std::enable_if\u0026lt;std::is_same\u0026lt;typename std::iterator_traits\u0026lt;T\u0026gt;::value_type,V\u0026gt;::value,T\u0026gt;::type NotUsedJustForIteratorCheckType; //哈哈哈,天才!天才! for (auto it=begin;it!=end;++it) cout \u0026lt;\u0026lt; *it \u0026lt;\u0026lt; endl; }};int main() { vector\u0026lt;int\u0026gt; a{1,2,3,4}; auto b=Foo\u0026lt;int\u0026gt;(a); b.bar(a.begin(),a.end());//如果传入的是vector\u0026lt;float\u0026gt;::iterator之类与V类型不同的就能检查出错误}
@vczh 大这样唔错吧?问题是你说的C++14,我找不到支持C++14的编译器啊,VC++难道已经支持了?或者用Boost的Concept Check?------------------------------------V大说VC++2013最后一个补丁打上即将完全支持C++14,可是我用的是穷人的操作系统。上面的实现方式不支持函数重载,果然。
推荐阅读
- 非计算机专业想要利用课余时间深入自学C++,想要找到比较体面的工作大概需要啥水平
- 车市百晓生|拥出众实力方能定义市场 试驾吉利星瑞
- Java工程师和C++工程师在工作上有啥区别哪个更适合自身发展
- 环球车讯网|软件能否定义汽车
- Tensorflow 中咋定义自己的层呢
- C语言指数函数代码
- 单例模式static函数必须在头文件中实现么
- |合资品牌的搅局者,吉利星瑞重新定义自主A级车
- 钛媒体|同样都主张“年轻人第一台车”,哈弗初恋是如何定义的?
- 车图腾|重新定义商务轻客!金杯海狮王售价8.49万元起