gpt4 book ai didi

c++ - 构造函数中的 Constexpr 评估

转载 作者:太空狗 更新时间:2023-10-29 20:34:57 25 4
gpt4 key购买 nike

我开发了自己的字符串类,它既有小字符串优化,又有一个内部标志来判断字符串是 Ascii、UTF8、WTF8 还是字节字符串。构造器

String(const char* );

可用于构造 Ascii 字符串或 UTF8 字符串。它应该只与文字一起使用,例如:

const String last_name = "Fayard"
const String first_name = "François"

构造函数需要计算字符串的长度并检查它是 Ascii 还是 UTF8。因此,我编写了这些函数,以便可以在编译时对其求值。

inline constexpr il::int_t size(const char* s) {
return (*s == '\0') ? 0 : (size(s + 1) + 1);
}

inline constexpr bool isAscii(const char* s) {
return (*s == '\0')
? true
: (((static_cast<unsigned char>(*s) & 0x80_uchar) ==
0x00_uchar) && isAscii(s + 1));
}

构造函数是这样写的,在headers中可用,所以他可以被内联。

String(const char* data) {
const int n = size(data);
const bool ascii = isAscii(data);

if (n <= max_small_string) {
...
} else {
data_ = malloc();
...
}
}

但我无法在编译时评估函数大小和 isAscii 运行(尝试使用 gcc 4.8.5、clang 4.0.1、icpc 17.0.4 检查程序集)。有办法吗?

PS:解决方案只需要是 C++11 并使用 gcc 4.8.5 和 Visual Studio 2015 编译。

最佳答案

函数的参数不是constexpr,所以你不能传播字符串文字。

一种方法是将文字字符串转换为字符序列:

template<typename C, C...cs> struct Chars
{
using str_type = C[1 + sizeof...(cs)];
static constexpr C str[1 + sizeof...(cs)] = {cs..., 0};

constexpr operator const str_type&() const { return str; }
};

template<typename C, C...cs> constexpr C Chars<C, cs...>::str[1 + sizeof...(cs)];

// Requires GNU-extension
template <typename C, C...cs>
constexpr Chars<C, cs...> operator""_cs() { return {}; }

没有 gnu 扩展,你必须像我一样使用一些 MACRO 将文字转换为字符序列 there .

然后您将获得来自类型的所有值信息:

template <typename C, C ... Cs>
constexpr il::int_t size(Chars<C, Cs...>) {
return sizeof...(Cs);
}

template <typename C, C ... Cs>
constexpr bool isAscii(Chars<C, Cs...>) {
// C++17 folding expression
return ((static_cast<unsigned char>(Cs) & 0x80_uchar) == 0x00_uchar && ...);
}

或者对于 C++11:

template <typename C>
constexpr bool isAscii(Chars<C>) { return true; }

template <typename C, C head, C ... Cs>
constexpr bool isAscii(Chars<C, Cs...>) {
// C++17 folding expression
return ((static_cast<unsigned char>(Head) & 0x80_uchar) == 0x00_uchar
&& isAscii(Chars<C, Cs...>{});
}

关于c++ - 构造函数中的 Constexpr 评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45537471/

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