gpt4 book ai didi

c++ - 从 c++11 中的用户定义文字返回 std::array

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:29:48 25 4
gpt4 key购买 nike

我刚刚安装了 gcc-4.8.1,当我意识到我可以执行 -std=c++1y 并获得多行 constexpr 时,我非常兴奋。我很想知道,是否有办法使这项工作正常进行?

#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 做任何事情。有没有办法从参数中获取常量表达式?

最佳答案

您需要一个模板文字运算符。函数参数永远不是有效的常量表达式;即使正常使用有意义,您的运营商仍然必须支持形式的显式调用

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 中可以做什么的小演示。

关于c++ - 从 c++11 中的用户定义文字返回 std::array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17562255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com