【问题标题】:One function for handling char* and wchar_t*一种处理 char* 和 wchar_t* 的函数
【发布时间】:2016-06-15 08:46:41
【问题描述】:

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

这两个函数的唯一区别是我必须将'a' 用于char* 而L'a' 用于wchar_t*。

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

【问题讨论】:

  • 如果您需要解析器中的文字,我怀疑这可以通过模板合理地解决。可能是预处理器宏的有效用例。
  • 他可以使用 char/char* 文字,然后将其“转换”为适当的类型
  • 你愿意依赖wchar_t('a') == L'a'吗?这在形式上是不可移植的,但可以通过static_assert 进行验证。 IE。它适用于健全的系统,不能在其他地方编译。

标签: c++ templates char wchar-t wchar


【解决方案1】:

它可以用特征而不用宏来完成,但它很麻烦而且容易出错,因为每个字符或字符串文字都必须在两个模板特化中重复。不过,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"));
}

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

【讨论】:

    【解决方案2】:

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

    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);
        // ...
    }
    

    【讨论】:

    • 编写一个完整的解析器听起来很乏味。
    • 它解决了我从“这两个函数的唯一区别是我必须对 char* 使用 'a' 而对 wchar* 使用 L'a'。”所理解的问题,而不是您遇到的问题期待 OP 有。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多