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,可是我用的是穷人的操作系统。上面的实现方式不支持函数重载,果然。


    推荐阅读