C++差の自動タイプへの変換std::stringとchar*
-
22-07-2019 - |
質問
合的な学習の行使ってみるとどのよう自動タイプの変換作可能です。I 知 この自動タイプの変換は一般的に避けられない知識を増やC++による脳の機能を解明しよう。
を制作しました StdStringConverter
クラスのときに自動的に変換され std::string
, ものの、コンパイラ(g++4.3.4Debianなってはならないものとしますの変換時のオブジェクトに対して比較される実 std::string
(は無視してくださいが通過による参照は、必要創造の一時オブジェクト):
#include <string>
class StdStringConverter
{
public:
explicit StdStringConverter(std::string name) : m_name(name) {}
operator const std::string () const { return m_name; }
private:
std::string m_name;
};
int main()
{
StdStringConverter converter(std::string("Me"));
const std::string name = "Me";
// Next line causes compiler error:
// no match for 'operator==' in 'converter == name'
return (converter == name) ? 0 : 1;
}
一方で、変更した場合、購入したので少し、 CStringConverter
クラスの自動変換 は 場が比較 char
ポインタょういう意:
#include <string>
class CStringConverter
{
public:
explicit CStringConverter(std::string name) : m_name(name) {}
operator const char* () const { return m_name.c_str(); }
private:
std::string m_name;
};
int main()
{
CStringConverter converter(std::string("Me"));
const char* name = "Me";
// Next line compiles fine, but they are not equal because the
// pointers don't match.
return (converter == name) ? 0 : 1;
}
ものがあるのか、それは何なのか特徴の違い std::string
や char*
このコンパイラーないしは同一者でもいいですか?
解決
問題は、いようstd::stringは実際のクラスのインスタンステンプレートstd::basic_string.オペレーター==ご用意している名前空間std間std::basic_stringテンプレート:
template<class charT, class traits, class Allocator>
bool operator==(const basic_string& lhs,
const basic_string& rhs);
場合このバージョンのオペレーター==った過負荷特std::string,コードとなっております。実際にはそうではありませんの場合、あるいはコンパイラをテンプレートの引数を控除しのテンプレートパラメータのstd::basic_stringることができると理解を返しの変換オペレーターが可能です。
しかし、コンパイラとしています。たものかわからない、というのは、標準の国のこと。ものの考え方であるなどの変換作業のための非テンプレートです。
ひとつのIを提案することができる場StdStringConverterに名前空間を提供バージョンのオペレーターにする===std::stringその名前このように、コンパイラを探して表現するADL(引数依存性のルックアップ)が登場しく働きます。
#include <string>
namespace n1 {
class StdStringConverter
{
public:
explicit StdStringConverter(std::string name) : m_name(name) {}
operator std::string () { return m_name; }
private:
std::string m_name;
};
bool operator==(std::string const& a, std::string const& b)
{
return a == b; //EDIT: See Paul's comment on std::operator== here.
}
}
int main()
{
using namespace n1;
StdStringConverter converter(std::string("Me"));
std::string name = "Me";
return (converter == name) ? 0 : 1;
}
他のヒント
最初の例では、両に比べてクラス(文字列とStdStringConverter)お得な特別な処理からコンパイラタイプ変換する.このオペレーターの過負荷またはなってきます。のコンパイラのリストのオペレーター==過負荷外し込むようになっていて、そのようStdStringConverterで叫にありがとうございます。
第二の名前はchar*.ですので、プリミティブ型のコンパイラの組み合は、非プリミティブをchar*.てから今まで、オーバーライドした場での作品と比べてスしています。
のコンパイラは明示的に型キャスト事業を含まない原始的な種類です。ものではないツールを使おうとするであろうコンストラクタの種類。例えば、ご変更の場合は最初の例です:
#include <string>
class StdStringConverter
{
public:
StdStringConverter(std::string name) : m_name(name) {}
bool operator==(const StdStringConverter &name) { return m_name == name.m_name; }
operator const std::string () const { return m_name; }
private:
std::string m_name;
};
int main()
{
StdStringConverter converter(std::string("Me"));
const std::string name = "Me";
// Next line causes compiler error:
// no match for 'operator==' in 'converter == name'
return (converter == name) ? 0 : 1;
}
現在のプログラムは0を返します。コンストラクタでは明示的にコンパイラツールを使おうとするであろうで変換し文字列をStdStringConverter.以来、現在はオペレーター==のStdStringConverterものです。
複数あり。変更した場合の戻り算書thusly
return(std::オペレーター==(name,name))?0:1;
で統ではありません同じことをしているのです。一方
return(std::オペレーター==(コンバーター名称)?0:1;
ないものに関するより興味深いエラーメッセージ
ないマッチング機能の呼び出'演算子==(StdStringConverter&,const std::string&)
を彷彿とさせるオペレーター==鋳型にbasic_string<>は、三つのテンプレートパラメータをボタンをクリックします。ご利用の場合intえおよstd::string,コンパイラのない文章がありました。
取得方法ご希望の効果をstd::stringは興味深い...