7

この関数テンプレートがあるとします。

template<typename T1, typename T2>
auto DoSomething(const T1& arg);

もちろん、この関数には末尾の戻り型が必要ですが、関数の目的を考えると、私は本当に正しく理解できませんでした。

この関数が行うことになっているのは、オブジェクトを使用argして何らかの操作を実行し、その操作の結果を関数の戻り値として使用することです。明らかに、のリターンタイプは、実行された操作のリターンタイプおよびオブジェクトと(互換的に)一致する必要があります。argT2DoSomething()argT2

ここでも、DoSomething()乗算などの実際の操作を実行するとします。次にDoSomething()、次のコードのように記述します。

template<typename T1, typename T2>
auto DoSomething(const T1& arg) -> /* trailing return-type */ {
    T2 t2Obj;   // Or have it obtained in some other way
    return arg * t2Obj;
}

次に、このための末尾のリターンタイプをどのように形成する必要がありますか?


PS:トレーリングリターンタイプには、、およびその他の非常に奇妙な外観のをdecltype(arg * T2)使用decltype(T1 * T2)decltype(T1::operator * (T2))てみました。decltypeそれらのどれも機能しませんでした。

4

1 に答える 1

10

次のように使用する必要がdecltypeありますstd::declval<>

template<typename T1, typename T2>
auto DoSomething(const T1& arg) -> decltype(arg * std::declval<T2>())
{
    T2 t2Obj;   // Or have it obtained in some other way
    return arg * t2Obj;
}

T2デフォルトのコンストラクターがない可能性があるため、機能しない可能性がありますdecltype(arg *T2())

T2しかし、デフォルトのコンストラクターがない場合は、どちらも記述できないことにも気づきましたT2 t2Obj。したがって、デフォルトのコンストラクターが必要な場合は、次のように記述できます。 T2

-> decltype(arg *T2()) //requirement : T2 must have default constructor

デフォルトのコンストラクターが必要な場合にも機能するはずです。 T2

于 2012-12-29T09:01:12.577 に答える