是否有人編寫腳本,插件或可執行文件,用編譯器推導的類型替換每個'auto'實例?我需要移植一些C++ 11代碼,它會在整個地方使用auto。用推斷類型替換自動關鍵字(鏗鏘聲或VS2010)
鐺是我的第一個候選人。有沒有人修改它來做這樣的事情?
另一種方法是解析來自編譯器的錯誤,因爲預期的類型可能在錯誤輸出中。我可以-Dauto=int
並可能回來"could not convert std::vector<int>::iterator to 'int'"
是否有人編寫腳本,插件或可執行文件,用編譯器推導的類型替換每個'auto'實例?我需要移植一些C++ 11代碼,它會在整個地方使用auto。用推斷類型替換自動關鍵字(鏗鏘聲或VS2010)
鐺是我的第一個候選人。有沒有人修改它來做這樣的事情?
另一種方法是解析來自編譯器的錯誤,因爲預期的類型可能在錯誤輸出中。我可以-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);
誠然,一個毫無意義的例子,但它表明,沒有辦法知道,以取代汽車,當依賴於模板參數。順便說一句,其中包含表示相應迭代器類型的同名(iterator
)的類型定義,因此typename T::iterator it
可以在此處起作用,但您可以將foo
實例化爲T
,它沒有這樣的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> >
取代它。這是標準庫的實現細節,很難閱讀,顯然也不便攜 - 你不需要那在你的代碼中。
在你很例如,我的編譯器(GCC 4.4.6)說:
error: cannot convert
__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >
toint
in initialization
不太可能。我們傾向於將軟件移植到C++ 11,而不是從C++ 11移植到C++ 11。 –
這甚至不可能 - 不在類型取決於模板參數的模板中。 – sellibitze
但據我所知,VisualStudio足夠聰明,可以告訴你,如果你用鼠標將鼠標懸停在變量上 - 除非它依賴於模板參數。 – sellibitze