0
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);

usingboost::is_same不起作用,return s因为string_t typedef'ed as 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);charwchar字符串都转换为string_t. 其中 T 也可以是charwchar_t。你可以在问题中看到string_t是灵活的。它也可以是两者charwchar_t字符串

4

1 回答 1

1

我不能删除所有的重载,因为你有不同的函数来转换每个方向。我使用了结构的模板特化,但也应该可以使用重载来实现。

辅助类(及其特化)可以很容易地放置在命名空间中以移动它,因此它对用户不可见(例如,请参阅detailboost 下的任何命名空间)。此外,如果在没有提供必要的专业化的情况下使用某种组合,它将无法编译。

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);
}
于 2012-08-02T17:27:52.530 回答