2013-07-10 65 views
4

我剛剛安裝了gcc-4.8.1,當我意識到我可以執行-std = C++ 1y並獲得多行constexpr 。我很想知道,有沒有做這項工作?從C++中的用戶定義文字返回std :: array 11

#include <array> 

constexpr auto operator "" _a1 (const char* text, const size_t size) -> std::array<char,size> { 
    std::array<char,size>() blah; 
    std::strncpy(blah.data(), test, size); 

    // do some stuff to blah at compile time 

    return blah; 
} 


int main() { 
    auto blah = "hello world"_a2; 
} 

但我得到一個大的可怕:

$ g++ test.cpp -std=gnu++1y -Wall -Werror -Wextra -Weffc++ -pedantic 
test.cpp:3:100: error: use of parameter ‘size’ outside function body 
constexpr auto operator "" _a1 (const char* text, const size_t size) -> std::array<char,size> { 
                            ^
test.cpp:3:100: error: use of parameter ‘size’ outside function body 
test.cpp:3:100: error: use of parameter ‘size’ outside function body 
test.cpp:3:104: error: template argument 2 is invalid 
constexpr auto operator "" _a1 (const char* text, const size_t size) -> std::array<char,size> { 
                             ^
test.cpp: In function ‘int main()’: 
test.cpp:26:17: error: unable to find string literal operator ‘operator"" _a1’ 
    auto blah = "hello world"_a1; 

反正有做到這一點?我無法從constexpr返回一個std :: string,並且似乎沒有任何我可以用模板或decltype做的事情。無論如何,從參數中獲得一個常量表達式?

回答

7

您需要一個模板文字運算符。函數參數永遠不是有效的常量表達式即使正常使用有意義的操作仍具有支持的形式

operator "" _a1 ("hello", 5); 

對於整數和浮點用戶自定義文字的顯式調用,有一個模板化的形式,可以返回array

template< char ... c > 
constexpr std::array< char, sizeof ... (c) > 
operator "" _a1() { 
    return { c ... }; 
} 

這還不支持字符串文字(可能是因爲多字節編碼問題)。

所以,你在這種特殊的方法中運氣不好。

儘管如此,您可以採取另一種方式,並將字符串作爲數組使用。

template< std::size_t size > 
constexpr std::array< char, size > 
string_to_array(char const (&str)[ size ]) 
    { return string_to_array(str, make_index_helper<size>()); } 

template< std::size_t size, std::size_t ... index > 
constexpr std::array< char, size > 
string_to_array(char const (&str)[ size ], 
       index_helper< index ... >) 
    { return {{ str[ index ] ... }}; } 

這需要一個支持模板index_helper產生整數{ 0, 1, 2, ... size }的計數包。

還要注意的是constexpr可能不適合你心目中的應用程序。一個constexpr函數不能包含一系列命令式語句。唯一允許計算任何內容的語句是return或構造函數constexpr,這是一個成員初始化。

更新:Here's的你可以做什麼一點點的演示,在C++ 11。

+0

這看起來很酷,我會在它去這個​​afternoon.C++ 14將支持多constexpr功能,但它看起來像我錯了,這並沒有使它成爲GCC呢。 – HNJSlater

+0

這對我很有用,非常感謝! – HNJSlater

相關問題