2016-03-02 51 views
0

现在我有两个函数完成相同的解析工作,一个用于char*,另一个用于wchar*。我想只有一个函数,所以我只需要更改一次(为了一致性)。将整个字符串转换为char*wchar*不是一个选项,因为字符串可能很长,因此不应在内存中复制。处理char *和wchar的一个函数*

两种功能的区别仅在于,我必须使用'a'代替char*,而使用L'a'代替wchar*

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

+0

我怀疑这可以用合理的模板来解决,如果你需要解析器中的文字。可能是预处理器宏的有效用例。 –

+0

他可以使用'char/char *'文字,然后将其转换为适当的类型 –

+0

您是否愿意依赖'wchar_t('a')== L'a''?这在形式上是不可移植的,但它可以用'static_assert'来验证。即它适用于理智的系统,不会在其他地方编译。 – MSalters

回答

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

它解决了我所理解的问题“只有两个函数的区别在于,我必须使用'a'作为char *,而'a'作为wchar *。”,而不是您期望OP所具有的问题。 – hansmaad

0

它可以与特性和无宏来完成,但它的繁琐和容易出错的,因为每一个字符或字符串字面量在这两个模板特重复。 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")); 
} 

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

+0

感谢您的回答,但是,这只是移动了同样的问题...... – MrTux