将auto关键字替换为推导的类型(clang或VS2010)
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
包含相同名称的typedef(iterator
),它们表示各自迭代器的类型,因此typename T::iterator it
在这里可以工作,但您可以为没有此类typedef的T
实例化foo
。
标准库类中的大量typedef正是为了允许在auto
被发明/重新使用之前编写此类模板而添加的,对于没有auto
的编译器,您也可以做同样的事情。但这不是一件可以自动化的事情,至少不需要像在编译器中添加对auto
的支持那样努力。。。
即使auto
不依赖于模板类型,也很难用对用户有意义且可移植的东西来替换它。Take:
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
- 奇怪的结构&GCC&clang(void*返回类型)
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- Clang 工具,用于提取给定 lambda 类型的 lambda 主体
- 结构化绑定初始值设定项表单 { 赋值表达式 } 对于 clang 上的数组类型失败
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- 与不同变量类型相比,用于变量的 Clang AST 匹配器
- Clang 对使用的类型别名发出"unused type alias"警告
- 在Clang Tidy检查中获取Vardecl的类型
- 为什么Clang报告与不兼容的类型相同
- clang 拒绝具有尾随 decltype 返回类型的模板调用是否正确,具体取决于其重载之一?
- Clang和GCC在转换C++17中非类型模板参数的自动说明符中存在分歧
- 运算符/ STD :: Chrono ::持续时间和自定义类型与Clang
- g++和clang++在结构/类专门化中具有非类型参数的不同行为
- 如何用clang格式分隔lambda的尾部返回类型
- GCC 中的编译器错误,但在将 decltype 与具有尾随返回类型语法的模板化成员函数一起使用时没有 clang
- clang vs gcc CRTP:constexpr 变量不能有非文字类型
- Clang++ - fmodules 错误使用 #include <cstdint>后的类型
- Clang无法在模板类专业化中编译模板功能,该模板类专业化与模板声明具有 *不同的返回类型 *
- 将auto关键字替换为推导的类型(clang或VS2010)
- __m256未知类型(clang 5.1/i5 CPU)