string_t from(wstring OR string)string_t也可以是typedef

时间:2012-08-02 16:54:25

标签: c++ string templates metaprogramming overloading

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_tchar。现在我想要两个智能转换输入字符串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_samereturn 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);
  }
}

使用模板以及重载确定InputTypestring_t是否相同是正向的,但如果它们不相同则会有4种变体。

如何对此方案建模而不重载类型运算符

摘要

如何设计将settings::string_t from(const std::basic_string<T>& s);char字符串转换为wchar的{​​{1}}。其中T也可以是string_tchar。你可以在问题中看到wchar_t是灵活的。它也可以是string_tchar字符串

1 个答案:

答案 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);
}