-2

このテンプレート化された operator() は、reference_wrapper 実装でどのように機能しますか?

template <class T>
class reference_wrapper {
public:
  // types
  typedef T type;

  // construct/copy/destroy
  reference_wrapper(T& ref) noexcept : _ptr(std::addressof(ref)) {}
  reference_wrapper(T&&) = delete;
  reference_wrapper(const reference_wrapper&) noexcept = default;

  // assignment
  reference_wrapper& operator=(const reference_wrapper& x) noexcept = default;

  // access
  operator T& () const noexcept { return *_ptr; }
  T& get() const noexcept { return *_ptr; }

ここに行きます:

  template< class... ArgTypes >
  typename std::result_of<T&(ArgTypes&&...)>::type
    operator() ( ArgTypes&&... args ) const {
    return std::invoke(get(), std::forward<ArgTypes>(args)...);
  }

それにしても、なぜ operator() が必要なのでしょうか? 使い方?

返される内容「result_of::type」は何ですか?

(ArgTypes && ..) とは??

呼び出す(取得する)???

このコードは別の惑星の C++ のように見えます :)

private:
  T* _ptr;
};
4

1 に答える 1

1

それにしても、なぜ operator() が必要なのでしょうか? 使い方?

次のコンテキストを仮定します

int foo(int bar)
{
    return bar + 5;
}

int main()
{
    std::reference_wrapper<int(int)> ref = foo;
    ref(5);
}

ref(5)operator()参照ラッパーの呼び出し。この場合、ユーザー定義の変換が行われないため、そこにない場合は機能しません。

operator()std::result_of<T&(ArgTypes&&...)格納された関数の戻り値である return を返し、そのstd::invokeような関数を呼び出してパラメータを転送します。

于 2016-06-29T06:01:14.400 に答える