namespace settings{
typedef wchar_t char_t;
typedef std::basic_string<char_t> string_t;
}
namespace util{
namespace string{
std::basic_string<wchar_t> toWide(const std::basic_string<char>& s);
std::basic_string<char> fromWide(const std::basic_string<wchar_t>& w);
}
}
这就是我的意思。 char_t
可能是wchar_t
或char
。现在我想要两个智能转换输入字符串settings::string_t
settings::string_t from(const std::basic_string<char>& s);
settings::string_t from(const std::basic_string<wchar_t>& s);
使用boost::is_same
对return s
无效,因为 string_t typedef为wstring但返回字符串
settings::string_t util::string::from(const std::basic_string< char >& s){
if(boost::is_same< std::basic_string<char> , settings::string_t >::value){
return s;
}else{
return toWide(s);
}
}
使用模板以及重载确定InputType
和string_t
是否相同是正向的,但如果它们不相同则会有4种变体。
如何对此方案建模而不重载类型运算符?
如何设计将settings::string_t from(const std::basic_string<T>& s);
和char
字符串转换为wchar
的{{1}}。其中T也可以是string_t
或char
。你可以在问题中看到wchar_t
是灵活的。它也可以是string_t
或char
字符串
答案 0 :(得分:1)
我无法删除所有重载,因为您有不同的功能来转换每个方向。我使用了结构的模板特化,但也应该可以使用重载来实现。
可以很容易地将助手类(及其特化)放在命名空间中以移动它,使其对用户不可见(例如,请参阅boost下的任何detail
命名空间)。此外,如果使用某种组合而没有提供必要的专业化,它将无法编译。
template<typename FromCharT, typename ToCharT>
struct helper;
// If T is the same on both sides, just copy
template<typename T>
struct helper<T, T>
{
static std::basic_string<T> convert(const std::basic_string<T>& s)
{
return s;
}
};
// char -> wchar_t
template<>
struct helper<char, wchar_t>
{
static std::basic_string<wchar_t> convert(const std::basic_string<char>& s)
{
return toWide(s);
}
};
// wchar_t -> char
template<>
struct helper<wchar_t, char>
{
static std::basic_string<char> convert(const std::basic_string<wchar_t>& s)
{
return fromWide(s);
}
};
template<typename T>
settings::string_t from( const std::basic_string<T>& f)
{
return helper<T, settings::char_t>::convert(f);
}