2

したがって、次のようなコードがある場合:

shared_ptr<Foo> bar (my_normal_operator<Foo>(mumble));

Fooは左フィールドから出てきますが、戻り値の型は、指定されたものへの「追加」パターンのみを介して生成されるため、機能します。

template <typename Target, typename Source>
shared_ptr<Target> my_normal_operator(Source src)
{
    /* ... whatever ... */
}

しかし、状況が次のようになったらどうなるでしょうか。

shared_ptr<Foo> bar (my_pointer_operator<Foo*>(mumble));

ポインターを型から引き離すには何らかの方法が必要です。掘り下げてstd::remove_pointerを見つけましたが、単純なアプリケーションでは「型/値の不一致」が発生します。

template <typename Target, typename Source>
shared_ptr< std::remove_pointer<Target>::type > my_pointer_operator(Source src)
{
    /* ... whatever ... */
}

私は実際にそれが機能するとは思っていませんでした...しかし、私が探しているものの表現としてここに入れています。

はぁ。テンプレートと特性を使用して新しい領域に足を踏み入れるたびに、「自分が何をしているのかわからない」ミーム動物の1人のように感じます. :-/

4

1 に答える 1

3

必要なものtypename:

template <typename Target, typename Source>
shared_ptr< typename std::remove_pointer<Target>::type >
    my_pointer_operator(Source src)
{
    /* ... whatever ... */
}

の型はstd::remove_pointer<Target>::typeテンプレート引数に依存するためです。

個人的には、 useの定義内にそのまま残しTargetて、呼び出し元が戻り値をより直接的に指定できるようにします。関数名は、実装の違いを示しています。Foomy_pointer_operatortypename std::add_pointer<Target>::type

于 2012-06-28T00:59:09.767 に答える