如何从constexpr类对象中获取值

How to get value out of constexpr class object?

本文关键字:获取 对象 constexpr      更新时间:2024-09-21

我有一个可以构造constexpr的类。我使用它确实在编译时更改了一些字符串文字。在这个精心设计的示例中,您可以看到constexpr构造函数被调用,然后它将处理本地成员data_。但是我怎样才能最终得到data_呢?我的方法似乎不起作用:

(演示(

#include <cstdio>
#include <cstddef>
template <const char* S>
struct cxprstring
{
constexpr cxprstring() : data_{S} {
// ...
// (further processing of data_)
}
constexpr static const char value[] = cxprstring<S>{}.data_;
char data_[] = {};
};
template <const char* S>
constexpr const char format_view[] = cxprstring<S>::value;
constexpr const char a[] = "hello ";
int main()
{
printf("%sn", format_view<a>);
}

它会产生以下错误:

<source>:12:59: error: initializer fails to determine size of 'cxprstring<S>::value'
12 |     constexpr static const char value[] = cxprstring<S>{}.data_;
|                                           ~~~~~~~~~~~~~~~~^~~~~
<source>:18:53: error: initializer fails to determine size of 'format_view<S>'
18 | constexpr const char format_view[] = cxprstring<S>::value;
|                                                     ^~~~~

我怎样才能让它工作?

未大小的数组不能是类型的非静态数据成员。曾经

即使可以,它的大小无疑也必须由默认的成员初始值设定项来推导。在您的情况下是{},因此大小为0。这是不允许的。

即使大小可以由构造函数来推导。。。S指针。编译器不知道它指向多少个字符。因此无法获取它的大小。

这种做任何你想做的事情的方法都是不可行的。