2012-01-20 64 views
11

是否有人編寫腳本,插件或可執行文件,用編譯器推導的類型替換每個'auto'實例?我需要移植一些C++ 11代碼,它會在整個地方使用auto。用推斷類型替換自動關鍵字(鏗鏘聲或VS2010)

鐺是我的第一個候選人。有沒有人修改它來做這樣的事情?

另一種方法是解析來自編譯器的錯誤,因爲預期的類型可能在錯誤輸出中。我可以-Dauto=int並可能回來"could not convert std::vector<int>::iterator to 'int'"

+5

不太可能。我們傾向於將軟件移植到C++ 11,而不是從C++ 11移植到C++ 11。 –

+0

這甚至不可能 - 不在類型取決於模板參數的模板中。 – sellibitze

+1

但據我所知,VisualStudio足夠聰明,可以告訴你,如果你用鼠標將鼠標懸停在變量上 - 除非它依賴於模板參數。 – sellibitze

回答

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); 

誠然,一個毫無意義的例子,但它表明,沒有辦法知道,以取代汽車,當依賴於模板參數。順便說一句,其中包含表示相應迭代器類型的同名(iterator)的類型定義,因此typename T::iterator it可以在此處起作用,但您可以將foo實例化爲T,它沒有這樣的typedef。

標準類庫衆多的typedef都是一模一樣添加到允許前auto被髮明/重新定意寫這樣的模板,你可以做些什麼來應對不具有auto編譯器同樣的事情。但它不是你可以自動化的東西,至少不是沒有努力就可以在編譯器中添加對auto的支持......

即使auto不依賴於模板類型,也很難將其替換爲對用戶有意義並且便攜的東西。就拿:

std::map<int, int> m; 
auto it = m.find(42); 

的合理替代autostd::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> > > to int in initialization