2
namespace detail {
template <class F, class... Args>
inline auto INVOKE(F&& f, Args&&... args) ->
    decltype(std::forward<F>(f)(std::forward<Args>(args)...)) {
      return std::forward<F>(f)(std::forward<Args>(args)...);
}

template <class Base, class T, class Derived>
inline auto INVOKE(T Base::*pmd, Derived&& ref) ->
    decltype(std::forward<Derived>(ref).*pmd) {
      return std::forward<Derived>(ref).*pmd;
}

template <class PMD, class Pointer>
inline auto INVOKE(PMD pmd, Pointer&& ptr) ->
    decltype((*std::forward<Pointer>(ptr)).*pmd) {
      return (*std::forward<Pointer>(ptr)).*pmd;
}

template <class Base, class T, class Derived, class... Args>
inline auto INVOKE(T Base::*pmf, Derived&& ref, Args&&... args) ->
    decltype((std::forward<Derived>(ref).*pmf)(std::forward<Args>(args)...)) {
      return (std::forward<Derived>(ref).*pmf)(std::forward<Args>(args)...);
}

template <class PMF, class Pointer, class... Args>
inline auto INVOKE(PMF pmf, Pointer&& ptr, Args&&... args) ->
    decltype(((*std::forward<Pointer>(ptr)).*pmf)(std::forward<Args>(args)...)) {
      return ((*std::forward<Pointer>(ptr)).*pmf)(std::forward<Args>(args)...);
}
} // namespace detail

template< class F, class... ArgTypes>
decltype(auto) invoke(F&& f, ArgTypes&&... args) {
    return detail::INVOKE(std::forward<F>(f), std::forward<ArgTypes>(args)...);
}

ここから上記の実装を見ました:

http://en.cppreference.com/w/cpp/utility/functional/invoke

次に、コンパイラが必要な正確なバージョンにどのように一致するのか疑問に思います。SFINAE は末尾の戻り型で機能しますか?

4

1 に答える 1

3

SFINAE はテーリング戻り型で機能しますか?

はい。末尾の戻り値の型の構文は、新しい機能を有効にするわけではなく、パラメーターの型に依存する戻り値の型のいくつかのケースを簡単に記述できるようにするだけです。

template <class F, class... Args>
inline auto INVOKE(F&& f, Args&&... args) ->
   decltype(std::forward<F>(f)(std::forward<Args>(args)...) { ... }

同様に次のように書くこともできます

template <class F, class... Args>
inline decltype(std::forward<F>(std::declval<F&>())(std::forward<Args>(std::declval<Args&>())...))
INVOKE(F&& f, Args&&... args) { ... }

たとえば、他のすべてについても同じです。単純化できますが、単純化しても、戻り値の型が式と同じ構文を使用できないという事実により、return何が起こっているのかを理解するのが難しくなります。したがって、新しい構文。

SFINAE が機能しないのは、推定された戻り値の型だけです。も使用しますが、 SFINAE を無効にするautoのはキーワード自体ではありません。auto

于 2015-11-01T13:49:18.110 に答える