现在我有两个函数完成相同的解析工作,一个用于char*
,另一个用于wchar*
。我想只有一个函数,所以我只需要更改一次(为了一致性)。将整个字符串转换为char*
或wchar*
不是一个选项,因为字符串可能很长,因此不应在内存中复制。处理char *和wchar的一个函数*
两种功能的区别仅在于,我必须使用'a'
代替char*
,而使用L'a'
代替wchar*
。
有没有一种方法(例如,使用模板元编程)来实现这一点?
现在我有两个函数完成相同的解析工作,一个用于char*
,另一个用于wchar*
。我想只有一个函数,所以我只需要更改一次(为了一致性)。将整个字符串转换为char*
或wchar*
不是一个选项,因为字符串可能很长,因此不应在内存中复制。处理char *和wchar的一个函数*
两种功能的区别仅在于,我必须使用'a'
代替char*
,而使用L'a'
代替wchar*
。
有没有一种方法(例如,使用模板元编程)来实现这一点?
如果您只有一个或有限数量的文字,则可以使用简单的重载。
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);
// ...
}
编写整个解析器听起来很乏味。 –
它解决了我所理解的问题“只有两个函数的区别在于,我必须使用'a'作为char *,而'a'作为wchar *。”,而不是您期望OP所具有的问题。 – hansmaad
它可以与特性和无宏来完成,但它的繁琐和容易出错的,因为每一个字符或字符串字面量在这两个模板特重复。 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"));
}
一个长期的解决方案是摆脱必须支持这两种性格类型(或功能?)。
感谢您的回答,但是,这只是移动了同样的问题...... – MrTux
我怀疑这可以用合理的模板来解决,如果你需要解析器中的文字。可能是预处理器宏的有效用例。 –
他可以使用'char/char *'文字,然后将其转换为适当的类型 –
您是否愿意依赖'wchar_t('a')== L'a''?这在形式上是不可移植的,但它可以用'static_assert'来验证。即它适用于理智的系统,不会在其他地方编译。 – MSalters