2017-11-16 16 views
0

推測の戻り値の型

template<typename T, typename F> 
auto myfunc(T elem, F func) -> decltype(func(elem)) 
{ 
    return func(elem); 
} 

に、私は、関数の戻り値の型ができるかどうかを知りたいと、私は、decltypeの非常に簡単な使用方法を知っています関数の引数を参照することなく、引数の型、つまりdecltype(func, T)に似たものに推論されますか?

この場合、1つはタイプであり、もう1つはオブジェクトですが、私がしようとしていることは非常に自然なようです。しかし私は自分が望むものを表現する簡単な方法を見つけることに失敗しました。どんな助け?

ありがとうございます。

template<typename T, typename F> 
auto myfunc(T elem, F func) -> decltype(func(std::declval<T>())) 
{ 
    return func(elem); 
} 

しかし、あなたはすでにその型のオブジェクトを持っていることから、なぜわざわざ:

答えて

3

これはstd::declvalが何のためにあるのかを正確にですか?

+0

私の意図は、コンテナを渡して ':: value_type'を使用して、最初の要素(たとえば)を引数として取るmy関数の戻り値の型を決定することでした。 'declype(func(declval )))))' 'CType'はコンテナオブジェクトの型(' :: value_type'メンバを持っています)のようなものです。しかし、簡単には動作しません。 – Jersey

+0

@Jersey 'std :: declval'のカッコを追加してください(関数です)。 – Quentin

+0

本当にありがとうございました。そのような不正確さ(人間の言葉では)がセマンティクスの回りをどのように回転しているかは面白いです。そして、コンパイラは厄介です:p – Jersey