使用C++中的模板检测不同的字符串文本
Detecting different string literals using templates in C++
我正在使用模板来检测不同的字符串文字,我来到了以下代码(尝试使用 C++20(:
#include <iostream>
#include <type_traits>
template <typename T, std::enable_if_t<std::is_same_v<std::decay_t<T>, const char*>, int> = 0>
void print_str(T) {
std::cout << "char* print_strn";
}
template <typename T, std::enable_if_t<std::is_same_v<std::decay_t<T>, const char8_t*>, int> = 0>
void print_str(T) {
std::cout << "char8_t* print_strn";
}
template <typename T, std::enable_if_t<std::is_same_v<std::decay_t<T>, const wchar_t*>, int> = 0>
void print_str(T) {
std::cout << "wchar_t* print_strn";
}
int main() {
auto a = "hello"; // prints "char* print_str"
print_str(a);
auto b = L"hello"; // prints "wchar_t* print_str"
print_str(b);
auto c = u8"hello"; // prints "char8_t* print_str"
print_str(c);
}
我使用的事实是在 C++20 中,u8
前缀声明char8_t
类型。但这是我的问题:
- 即使前缀从 C++11 开始
u8
它也使用仅从 C++20 开始的char8_t
。那么如何检测前缀u8
在 C++11 到 C++20 之间的 UTF-8 字符串呢? - 如何更改模板以检测例如
const char*
和char*
哪个相同的功能?我尝试使用remove_const<>
但它不起作用,因为它不会从const char*
中删除const
。
-
您无法在 C++17 等没有它的语言中检测到
char8_t
。因此,您必须具有 constexpr 函数,该函数通过检查字符串的内容来检测它是否为 UTF-8。这样的功能对char8_t
也有意义。使用char8_t
构造非法 UTF-8 字符串很简单。C++17或更少不包含此类功能。 -
使用或?
std::is_same_v<std::decay_t<T>, const char*> || std::is_same_v<std::decay_t<T>, char*>
- 那么我如何检测在 C++11 到 C++20 之间以 u8 为前缀的 UTF-8 字符串呢?
字符串类型无法确保编码。
const char*
可用于 utf-8,但也可用于拉丁语-1
以同样的方式const wchar*
不需要 utf-16。
有一些启发式的方法来检测编码。
- 如何更改我的模板以检测例如常量字符*和字符*哪个相同的功能?我尝试使用
remove_const<>
但它不起作用,因为它不会从const char*
中删除const
。
const char *
!=char* const
.
您可以从后者中删除const
以获取char*
你可能会这样做
std::is_same_v<std::remove_const_t<std::remove_pointer_t<T>>, char> && std::is_pointer_v<T>
但只需更改为:
void print_str(const char*) { std::cout << "char* print_strn"; }
void print_str(const char8_t*) { std::cout << "char8_t* print_strn"; }
void print_str(const wchar_t*) { std::cout << "wchar_t* print_strn"; }
如果您坚持使用模板:
template <typename T>
void print_str(const T*) {
if constexpr (std::is_same_v<char, T>) {
std::cout << "char* print_strn";
} else if constexpr (std::is_same_v<char8_t, T>) {
std::cout << "char8_t* print_strn";
} else if constexpr (std::is_same_v<wchar_t, T>) {
std::cout << "wchar_t* print_strn";
}
}
相关文章:
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 在编译时检查字符串文本的长度
- 读取字符串文本输入以创建 2D 矢量
- 管理字符串文本的最佳做法
- 定义宏以将前缀 0x 添加到十六进制字符串文本
- 无法在模板参数中定义字符串文本
- 不推荐使用 PTCHAR 的字符串文本
- C++ 字符串文本和常量
- C++20字符串文本模板参数工作示例
- 返回从字符串文本创建的静态string_view是否安全?
- 在处理任何字符大小的模板中使用字符串文本
- 是否保证相同内容字符串文本的存储相同?
- 将以 null 结尾的字节字符串转换为原始字符串文本
- 是否可以创建一个用户定义的文本,将字符串文本转换为 own 类型的数组?
- 使用C++中的模板检测不同的字符串文本
- 无法完全专用化字符串文本的模板
- C++ - 确定 const char* 是指向字符串文本对象还是动态对象
- 是否可以在原始字符串文本中插入转义序列?
- C++带有捕获组的正则表达式字符串文本
- 为什么多维数组中的空字符串文本衰减为空指针?