[英]Replace auto keyword with deduced type (clang or VS2010)
是否有人编写过脚本,插件或可执行文件,用编译器推导的类型替换'auto'的每个实例? 我需要移植一些在整个地方都使用auto的C ++ 11代码。
Clang是我的第一个候选人。 有没有人修改它做这样的事情?
另一种方法是解析编译器中的错误,因为预期的类型可能在错误输出中。 我可以-Dauto=int
并且可能返回"could not convert std::vector<int>::iterator to 'int'"
不幸的是,在一般情况下这是不可能的。 考虑:
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);
不可否认,这是一个毫无意义的例子,但它表明,当依赖于模板参数时,无法知道替换auto的内容。 顺便提一下, std::map
和std::set
包含表示相应迭代器类型的同名( iterator
)的typedef,因此typename T::iterator it
可以在这里使用typename T::iterator it
,但你可以为T
实例化foo
没有这样的typedef。
标准库类中的众多typedef被准确地添加,以允许在auto
发明/重新使用之前编写这样的模板,并且您可以做同样的事情来处理没有auto
的编译器。 但这不是你可以自动化的东西,至少不是没有与向编译器添加auto
支持相媲美的努力......
即使auto
不依赖于模板类型,用一些对用户有意义且可移植的东西替换它也是一个难题。 采取:
std::map<int, int> m;
auto it = m.find(42);
auto
的合理替换是std::map<int, int>::iterator
,但如果使用-Dauto=int
并查看编译器错误消息,则用std::_Rb_tree_iterator<std::pair<const int, 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> > >
无法将__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >
为int
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.