std :: stringコンストラクターをオーバーロードできますか?
std :: wstringを受け取り、std::stringを返すコンストラクターを作成したいと思います。それは可能ですか、そしてどのように?
ありがとう。
std :: stringコンストラクターをオーバーロードできますか?
std :: wstringを受け取り、std::stringを返すコンストラクターを作成したいと思います。それは可能ですか、そしてどのように?
ありがとう。
std :: stringコンストラクターをオーバーロードできますか?
std::string
いいえ、宣言を変更する必要があります。
std :: wstringを受け取り、std::stringを返すコンストラクターを作成したいと思います。それは可能ですか、そしてどのように?
代わりに、次のような変換関数を使用できます。
std::string to_string(std::wstring const& src);
ただし、8ビットエンコーディングを使用して表現できないシンボルをどう処理するかを決定する必要がありますstd::string
。それらをマルチバイトシンボルに変換するか、例外をスローするか。wcsrtombs関数を参照してください。
むしろ、自由関数を定義します。
std::string func(const std::wstring &)
{
}
いいえ、に新しいコンストラクターを追加することはできませんstd::string
。できることは、スタンドアロンの変換関数を作成することです。
std::string wstring_to_string(const wstring& input)
{
// Your logic to throw away data here.
}
これを自動的に実行したい場合は、そのアイデアを再評価することを強くお勧めします。sは自動的に予想外の場合と同じようにwstring
扱われるため、かなりの頭痛の種になります。string
これは正しいやり方ではなく、これをコーディングしたときに何かを吸っていたと思いますが、それで問題は解決します。最後の関数`convert_str'を確認してください。
#pragma once
#include <memory>
#include <string>
#include <vector>
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/remove_const.hpp>
#include <boost/type_traits/remove_pointer.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/mpl/logical.hpp>
template <typename Target, typename Source, typename cond>
struct uni_convert {
};
template <typename Target, typename Source >
struct uni_convert<Target,Source,
typename boost::enable_if< boost::is_same<Target, Source>, int >::type > {
static Target doit(Source const& src)
{
return src;
}
};
template <typename Cond >
struct uni_convert<std::string,std::wstring,
Cond > {
static std::string doit(std::wstring const& src)
{
std::vector<char> space(src.size()*2, 0);
wcstombs( &(*( space.begin() )), src.c_str(), src.size()*2 );
std::string result( &(*( space.begin() )) );
return result;
}
};
template <typename Cond >
struct uni_convert<std::wstring,std::string,
Cond > {
static std::wstring doit(std::string const& src)
{
std::vector<wchar_t> space(src.size()*2, 0);
mbstowcs( &(*( space.begin() )), src.c_str(), src.size()*2 );
std::wstring result( &(*( space.begin() )) );
return result;
}
};
template< typename TargetChar >
std::basic_string< TargetChar > convert_str( std::string const& arg)
{
typedef std::basic_string< TargetChar > result_t;
typedef uni_convert< result_t, std::string, int > convertor_t;
return convertor_t::doit( arg );
}