用推断类型替换auto关键字(clang或VS2010)

时间:2012-01-20 01:05:15

标签: c++ c++11 clang auto

是否有人编写过脚本,插件或可执行文件,用编译器推导的类型替换'auto'的每个实例?我需要移植一些在整个地方使用auto的C ++ 11代码。

Clang是我的第一位候选人。有没有人修改它做这样的事情?

另一种方法是解析编译器中的错误,因为预期的类型可能在错误输出中。我可以-Dauto=int并可能返回"could not convert std::vector<int>::iterator to 'int'"

1 个答案:

答案 0 :(得分:8)

不幸的是,在一般情况下这是不可能的。考虑:

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::mapstd::set包含表示相应迭代器类型的同名typedef(iterator),因此typename T::iterator it可以在这里工作,但是你可以实例化对于没有此类typedef的fooT

标准库类中的众多typedef被准确添加,以允许在auto发明/重新定位之前编写这样的模板,并且你可以做同样的事情来处理没有编译的编译器。 ; t 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> >之类的内容。 }。这个标准库的实现细节,难以阅读,显然不便携 - 您不希望 代码

在您的示例中,我的编译器(GCC 4.4.6)说:

  

错误:无法在初始化

中将__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >转换为int