gpt4 book ai didi

c++ - 如何使用 C++ 模板推断编译时 const char 字符串的大小?

转载 作者:行者123 更新时间:2023-11-28 04:01:42 27 4
gpt4 key购买 nike

我正在尝试使用clang++ 来扩展this post 中的模板代码.这是我想出的。

constexpr unsigned int requires_inRange(unsigned int i, unsigned int len) {
return i >= len ? throw i : i;
}

class StrWrap
{
unsigned size_;
char * const begin_;

public:
template< unsigned N >
constexpr StrWrap( const char(&arr)[N] ) : begin_(arr), size_(N - 1) {
static_assert( N >= 1, "not a string literal");
}

constexpr char operator[]( unsigned i ) {
return requires_inRange(i, size_), begin_[i];
}

constexpr operator const char *() {
return begin_;
}

constexpr unsigned size() {
return size_;
}
};

constexpr unsigned count( StrWrap str, char c, unsigned i = 0, unsigned ans = 0 )
{
return i == str.size() ? ans :
str[i] == c ? count(str, c, i + 1, ans + 1) :
count(str, c, i + 1, ans);
}

int main(int argc, char const *argv[])
{
static_assert( count("dude", 'd') == 2, "d != 2" );
return 0;
}

但是,博客文章中的代码未编译:

/usr/bin/clang++ -Xclang -ast-print -fsyntax-only test_debugger2.cpp > main.exe

test_debugger2.cpp:12:48: error: cannot initialize a member subobject of type 'char *const' with an lvalue of type 'const char [5]'
constexpr StrWrap( const char(&arr)[N] ) : begin_(arr), size_(N - 1) {
^ ~~~
test_debugger2.cpp:38:26: note: in instantiation of function template specialization 'StrWrap::StrWrap<5>' requested here
static_assert( count("dude", 'd') == 2, "d != 2" );
^
test_debugger2.cpp:38:20: error: static_assert expression is not an integral constant expression
static_assert( count("dude", 'd') == 2, "d != 2" );
^~~~~~~~~~~~~~~~~~~~~~~
2 errors generated.

我可以找到这个相关问题 Cannot initialize a member subobject of type 'const signed char *' with an lvalue of type 'const char [X]' ,但我不知道如何修复它。

通过使用标志 -Xclang -ast-print -fsyntax-only 我只要求 clang 扩展模板并将它们的扩展打印到标准输出:Compile-time 'String' Manipulation with Variadic Templates

我正在尝试学习在编译时使用据说是图灵完备的 C++ 模板进行字符串计算,即字符串拆分、字符串连接、查找、替换、剪切等:C++ templates Turing-complete? , 然后,我将示例作为该博客文章并使用 clang 扩展它们以了解它们如何工作以及我如何使用它们来解决任何编译时(可能的)模板计算。

这是我的编译器版本:

clang version 8.0.1 (tags/RELEASE_801/final)
Target: x86_64-unknown-windows-cygnus
Thread model: posix
InstalledDir: /usr/bin

如何修复该博客文章中的模板扩展?

最佳答案

这个

char * const begin_;

是指向 charconst 指针(指针是 const,而不是它指向的东西)。这个

const char(&arr)[N]

是对类型为 const charN 元素数组的引用。数组的元素是常量。您不能将指向非常量点的指针指向 const 元素数组(至少在没有蛮力的情况下)。您需要将指针设为 const char* 或将数组设为非 const 元素的数组……

我猜你是想写

const char* begin_;

注意:从 C++17 开始,您可以只使用 std::string_view ……

关于c++ - 如何使用 C++ 模板推断编译时 const char 字符串的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59418505/

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