1

次のクラス スニペットを検討してください。

class A
{
public:
    template <class T>
    operator const T &() const;   
};

このようなテンプレート化された変換演算子は、どのような状況で適していますか?

4

1 に答える 1

2

参照に変換するのは見たことがありません (通常は一時的なものを返す必要があるため) が、通常は戻り値の型をオーバーロードするトリックの一部です。メインクラスにはさまざまなゲッター(またはさまざまな型を返す他の関数)があり、ジェネリックゲッターはこの型の変換演算子でプロキシを返します。

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また、プロキシを省略できるため、 の実装が確実に簡素化されます。

于 2013-09-10T16:32:51.867 に答える