现在我有两个函数可以完成相同的解析工作,一个用于char*
,另一个用于wchar_t*
。我想只有一个功能,所以我只需要更改一次(为了保持一致性)。将整个字符串转换为char*
或wchar_t*
不是一个选项,因为字符串可能很长,不应在内存中重复。
这两个函数的唯一区别在于我必须'a'
使用char*
而L'a'
使用wchar_t*
。
有没有办法(例如,使用模板元编程)来实现这个目标?
答案 0 :(得分:0)
如果您只有一个或有限数量的文字,那么简单的重载就可以完成这项任务。
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);
// ...
}
答案 1 :(得分:0)
可以使用traits和没有宏来完成,但它很麻烦且容易出错,因为每个char或string字符都必须在两个模板特化中重复。不过,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"));
}
长期解决方案是摆脱支持两种角色类型的必要性(或功能?)。