Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ string_t from(wstring或string),当string_t也可以是两者的typedef时_C++_String_Templates_Metaprogramming_Overloading - Fatal编程技术网

C++ string_t from(wstring或string),当string_t也可以是两者的typedef时

C++ string_t from(wstring或string),当string_t也可以是两者的typedef时,c++,string,templates,metaprogramming,overloading,C++,String,Templates,Metaprogramming,Overloading,使用boost::is_same对返回s不起作用,因为string类型定义为wstring,但返回string settings::string_t from(const std::basic_string<char>& s); settings::string_t from(const std::basic_string<wchar_t>& s); settings::string\u t util::string::from(const std:

使用
boost::is_same
返回s
不起作用,因为string类型定义为wstring,但返回string

settings::string_t  from(const std::basic_string<char>& s);
settings::string_t  from(const std::basic_string<wchar_t>& s);
settings::string\u t util::string::from(const std::basic\u string&s){
if(boost::is_same::value){
返回s;
}否则{
返回拖航;
}
}
识别
InputType
string\u t
是否使用模板和重载是最重要的,但如果它们不相同,则会出现4种变体

如何在不重载类型运算符的情况下对该场景建模

总结
如何从(const std::basic_string&s)设计
settings::string\u t
char
wchar
字符串转换为
string\u t
。其中T也可以是
char
wchar\u T
。您可以在问题
string\u t
中看到它是灵活的。它也可以是
char
wchar\u t
strings

我无法删除所有重载,因为您有不同的函数来转换每个方向。我使用了结构的模板专门化,但也可以使用重载

helper类(及其专门化)可以很容易地放置在名称空间中以移动它,这样用户就看不到它(例如,请参阅boost下的任何
详细信息
名称空间)。此外,如果在没有提供必要的专门化的情况下使用某些组合,它将无法编译

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);
  }
}
模板
结构助手;
//如果两边的T相同,只需复制即可
模板
结构辅助程序
{
静态std::basic_字符串转换(const std::basic_字符串&s)
{
返回s;
} 
};
//char->wchar\t
模板
结构辅助程序
{
静态std::basic_字符串转换(const std::basic_字符串&s)
{
返回拖航;
} 
};
//wchar\u t->char
模板
结构辅助程序
{
静态std::basic_字符串转换(const std::basic_字符串&s)
{
从广域返回;
} 
};
模板
设置::string\u t from(const std::basic\u string&f)
{
返回helper::convert(f);
}

如何从(const std::basic_string&s)设计
设置::字符串
char
wchar
字符串转换为
string\u t
。其中T也可以是
char
wchar\u T
。您可以在问题
string\u t
中看到它是灵活的。它也可以是
char
wchar\u t
strings“如何在不重载类型运算符的情况下对此场景进行建模?”这是什么意思?抱歉,如果我不够清楚,我想要的是
settings::string\t from(const std::basic\u string&s)
将char和wchar字符串转换为string\t我认为问题在于您必须提供4种转换:从char到char、从char到wchar、从wchar到wchar以及从wchar到char。OP试图避免这4个检查。基本上,它将涉及一个重载,该重载从(const string&)
通过
string\t,然后是一对重载,使用
boost::enable\u if
boost::is\u same
,根据当前的
设置::char\t
选择要使用的重载。我没有时间自己打字。
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);
  }
}
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);
}