一个用于处理字符* 和 wchar_t* 的函数

One function for handling char* and wchar_t*

本文关键字:wchar 函数 字符 一个 处理 用于      更新时间:2023-10-16

现在我有两个函数做完全相同的解析,一个用于char*,一个用于wchar_t*。我只想有一个函数,这样我只需要更改一次(为了保持一致性)。将整个字符串转换为 char*wchar_t* 不是一个选项,因为字符串可能很长,不应在内存中重复。

这两个函数的唯一区别是我必须使用 'a' 进行char* vs. L'a' wchar_t*.

有没有办法(例如,使用模板元编程)来实现这一点?

它可以使用 traits 来完成,也可以不使用宏来完成,但它很麻烦且容易出错,因为每个字符或字符串文本都必须在两个模板专用化中重复。不过,C++11 的auto有点帮助:

#include <string>
#include <iostream>
template <class CharType>
struct MyTraits
{
};
template <>
struct MyTraits<char>
{
    static auto constexpr a = 'a';
    static auto constexpr foo = "foo";
    static auto constexpr lb = 'n';
};
template <>
struct MyTraits<wchar_t>
{
    static auto constexpr a = L'a';
    static auto constexpr foo = L"foo";
    static auto constexpr lb = L'n';
};
template <class CharType>
void f(std::basic_ostream<CharType>& os, std::basic_string<CharType> const& s)
{
    os << s << MyTraits<CharType>::a << MyTraits<CharType>::foo << MyTraits<CharType>::lb;
}
int main()
{
    f(std::cout, std::string("bar"));
    f(std::wcout, std::wstring(L"bar"));
}

一个长期的解决方案是摆脱支持这两种字符类型的必要性(或功能?

如果你只有一个或有限数量的文字,一个简单的重载就可以完成这项工作。

wchar_t a(const wchar_t* text) { return L'a'; }
char a(const char* text) { return 'a'; }
template<typename T>
void parse(const T* text)
{
    auto t = a(text);
    find(text, t);
    // ...
}