不幸的是,在一般情况下这是不可能的.考虑:
template <typename T> void foo(T & t)
{
auto it = t.find(42);
...
}
...
std::map<int, int> m;
std::set<int> s;
...
foo(m);
foo(s);
Run Code Online (Sandbox Code Playgroud)
不可否认,这是一个毫无意义的例子,但它表明,当依赖于模板参数时,无法知道替换auto的内容. std::map并且std::set,顺便说一句,包含相同的名称(类型定义iterator)代表各自的迭代器的类型,所以typename T::iterator it就在这里工作,但你可以实例化foo一个T不具有这样一个typedef.
标准库类中的众多typedef被精确地添加,以允许在auto发明/重新使用之前编写这样的模板,并且您可以做同样的事情来处理没有的编译器auto.但这不是你可以自动化的东西,至少不是没有与添加对auto编译器的支持相媲美的努力......
即使auto不依赖于模板类型,用一些对用户有意义且可移植的东西替换它也是一个难题.采取:
std::map<int, int> m;
auto it = m.find(42);
Run Code Online (Sandbox Code Playgroud)
合理的替换auto是std::map<int, int>::iterator,但如果你使用-Dauto=int并查看编译器错误消息,你可以用类似的东西替换它std::_Rb_tree_iterator<std::pair<const int, int> >.这是标准库的实现细节,难以阅读,显然不是便携式-你不想那在你的代码.
在您的示例中,我的编译器(GCC 4.4.6)说:
错误:无法转换
__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >为int初始化
| 归档时间: |
|
| 查看次数: |
2039 次 |
| 最近记录: |