一个用于处理字符* 和 wchar_t* 的函数
One function for handling char* and wchar_t*
现在我有两个函数做完全相同的解析,一个用于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);
// ...
}
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 如何将CString转换为使用WCHAR的Windows API和自定义函数?
- C++通过引用 WCHAR** 传递到函数中
- 在WCHAR*和wstring之间转换,而不使用构造函数
- 如何用WCHAR*在消息框中显示c#中的C函数