次のクラス スニペットを検討してください。
class A
{
public:
template <class T>
operator const T &() const;
};
このようなテンプレート化された変換演算子は、どのような状況で適していますか?
次のクラス スニペットを検討してください。
class A
{
public:
template <class T>
operator const T &() const;
};
このようなテンプレート化された変換演算子は、どのような状況で適していますか?
参照に変換するのは見たことがありません (通常は一時的なものを返す必要があるため) が、通常は戻り値の型をオーバーロードするトリックの一部です。メインクラスにはさまざまなゲッター(またはさまざまな型を返す他の関数)があり、ジェネリックゲッターはこの型の変換演算子でプロキシを返します。
class MyClass
{
public:
template <typename T>
T typedGet() const { /*...*/ }
class Proxy
{
Main const* myOwner;
public:
Proxy( Main const& owner ) : myOwner( owner ) {}
template <typename T>
operator T()() const { return myOwner->typedGet<T>(); }
};
Proxy get() const { return Proxy( *this ); }
};
これと のインスタンスを使用するとMyClass
、次のように記述できます。
int x = myObj.get();
std::string y = myObj.get();
これは、構成ファイルのエントリのようなものによく使用され、構成ファイル内の文字列を必要なタイプに変換するtypedGet
ために使用std::istringstream
されます (もちろん、必要ないため、std::string の特殊化があります)。または が必要
std::istringstream
です。)
C++11 では、別の可能な解決策は次のとおりです。
auto x = myObj.get<int>();
auto y = myObj.get<std::string>();
私は完全には確信していません.これはauto
. MyClass
また、プロキシを省略できるため、 の実装が確実に簡素化されます。