gpt4 book ai didi

c++ - 使用C++中的模板检测不同的字符串文字

转载 作者:行者123 更新时间:2023-12-02 09:51:01 27 4
gpt4 key购买 nike

我当时正在使用模板来检测不同的字符串文字,然后出现以下代码(在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_str\n";
}

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_str\n";
}

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_str\n";
}

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类型。但是这是我的问题:
  • 即使u8前缀来自C++ 11,它也仅从C++ 20开始使用char8_t。那么,如何检测C++ 11和C++ 20之间带有u8前缀的UTF-8字符串?
  • 如何更改模板以检测const char*char*这两个功能相同?我尝试使用remove_const<>,但由于无法从const中删除const char*而无法使用。
  • 最佳答案

  • 您无法使用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++ - 使用C++中的模板检测不同的字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59381465/

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