2016-03-04 71 views
0

有沒有辦法確定類型是否是某種容器(可能與begin()end()end()和轉發迭代器)在c++98?我看到this,但它使用c++11decltype確定類型是否是編譯時在C++中的容器98

也爲每個容器(列表,向量等)進行專門化並不那麼吸引人 - 也許更普遍的東西?

可能重複......我想像這裏曾經是一個常見的問題

編輯

我覺得this幾乎是我需要什麼,我應該從中刪除tuple東西,用C++ 98代碼替換std::enable_if的使用。我現在應該怎麼處理這個問題?保持開放?要麼?如果有人爲我工作,我會很樂意接受他的回答:D

+0

「容器」的定義是什麼? –

+0

我不記得SFINAE基礎是否包含在C++ 98中。如果是這樣的話,應該可以手動將某些東西拼湊在一起,而不是使用罐裝的C++ 1x語言支持模板。美元兌甜甜圈這是MS-Windows相關的。現代Linux上的gcc很長一段時間都有很好的C++ 1x支持。 –

+0

@ M.M不知道......也許有一個'''begin()'''和'''end()'''和轉發迭代器? – onqtam

回答

0

您可以爲通用(非專業)模板中想要支持和編譯失敗的所有常見容器編寫專門化。

STL中沒有那麼多容器。只有大約15個。

在這種情況下,您的專業化將被普通容器採用普通機制,用戶仍然可以使用自己的容器,只要他們編寫需要的專業化。

還有一點與C++ 98/C++ 11有關。編譯器沒有一步實現所有C++ 11功能。例如,constexpr僅由Microsoft在VisualStudio 2015中實現。如果您嘗試在隨機編譯器上運行代碼,希望看到某些C++ 11功能在那裏,那麼某些功能不是。 。

這可能是不是一個很大的錯誤使用一些前提是你知道自己在實現足夠早在你感興趣的編譯器的C++ 11的特徵

+0

所以沒有沒有列出他們的方式?沒有辦法專注於使用begin()和end()的類型?這意味着boost容器(例如)不能在開箱即用 – onqtam

+0

您可以檢查模板參數中是否存在函數,並確定任何具有'begin()','end()'的類都是容器。不是很精確。需要專業化的用戶類可以被識別爲容器。 –

+0

以及我的情況下,C++ 98是強制性的 - 謝謝你的努力,雖然 – onqtam

相關問題