2015-10-18 104 views
0

有一個斯科特舒爾的實現編譯時字符串:轉換constexpr編譯字符串轉換成一個模板字符列表

class str_const { 
    const char* const p_; 
    const std::size_t sz_; 
public: 
    template <std::size_t N> 
    constexpr str_const(const char(&a)[N]) : p_(a), sz_(N-1) {} 
    constexpr char operator[](std::size_t n) { 
     return n < sz_ ? p_[n] : throw std::out_of_range(""); 
    } 
    constexpr std::size_t size() { 
     return sz_; 
    } 
}; 

這是不錯,但我想在編譯時字符表像string<'H', 'e', 'l', 'l', 'o'>操作。 有沒有辦法將str_const轉換成這樣的列表?

我能想到的實現路線是模板和函數。通過模板將str_const轉換爲其他東西是不可能的,因爲str_const對於非類型模板參數是無效的類型。同樣也不可能定義這樣的函數,因爲根據參數的值,它會有不同的返回值string<...>

UPD。編輯擺脫「你的問題可能是重複的」信息,因爲從這個問題的文本中可以明顯看出,一個字符串不是一個整數。

+0

與此相關的。http://stackoverflow.com/questions/33055791/efficient-way -to-convert-a-compile-time-known-function-argument-to-a-stdintegr –

回答

1

我認爲這應該是可能的。您可以在常量表達式中使用這些constexpr字符串類型。所以就像你可以將str[0]傳遞給期望一個整數參數的模板。

因此,您應該可以創建範圍從0到str.size()的模板。然後,你會重複實例化一些構建mpl :: string並重復調用concat的東西。

這需要一段時間才能實現,所以我現在不打算提供代碼,但我認爲這個想法是可能的。這是我的字符串實現可能有所幫助。該代碼有證明它可以在你試圖使用它的上下文中使用的測試

https://crazycpp.wordpress.com/2014/10/17/compile-time-strings-with-constexpr/ https://github.com/crazy-eddie/crazycpp/tree/master/20141016-constexprstr

+0

是的,這完全是我最終做的。雖然我無法弄清楚如何將這個可怕的電路隱藏到一個宏中。我確信有人曾經這樣做過,而且,老實說,我希望這個問題會被標記爲重複。這裏有一個草圖:http://ideone.com/jggupE –

+1

問題是,我看不到內聯可變模板的解壓縮方式。 –

+0

@ polkovnikov.ph - 你說得對。現在我想到了,我相信我已經嘗試過了。主要問題是函數參數不是constexpr。所以他們不能在不變的情況下使用,即使你只是簡單地回報他們。所以也許使用回報你可以創建一個常量範圍。 –