GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • cpprefjp - C++日本語リファレンス
  • GitHub Project

This view

  • Original page
  • New address

GeezerVison is showing cpprefjp.github.io — std::invoke - cpprefjp C++日本語リファレンス

  1. リファレンス
  2. functional
  3. invoke

最終更新日時: 2026年09月19日 21時31分51秒 (JST)
rotarymars が更新

履歴 編集

function template
<functional>

std::invoke(C++17)

namespace std {
  template <class F, class... Args>
  invoke_result_t<F, Args...> invoke(F&& f, Args&&... args)
    noexcept(is_nothrow_invocable_v<F, Args...>);           //C++17

  template <class F, class... Args>
  constexpr invoke_result_t<F, Args...> invoke(F&& f, Args&&... args)
    noexcept(is_nothrow_invocable_v<F, Args...>);           //C++20
}

概要

関数呼び出し可能なオブジェクトfとその引数args...の組み合わせでINVOKE要件に従った関数呼び出しを行う。

INVOKE要件とはC++における関数呼び出しという性質を抽象化しまとめた概念であり、invokeはその実体化、すなわち関数呼び出しという操作を統一したものである。

要件

型FおよびArgs...の組み合わせでINVOKE要件に従った関数呼び出しが可能であり、オーバーロード解決の結果が曖昧にならないこと。そうでない場合はコンパイルエラーとなる。

引数

  • f -- Callable オブジェクト(関数ポインタ/参照・関数オブジェクト・メンバポインタ)
  • args... -- fに与える引数列。fがメンバポインタである場合は対応するクラスのオブジェクト(もしくはそのreference_wrapper)がargs...の先頭になければならない

戻り値

fとargs...によりINVOKE要件に従った関数呼び出しを行い、その結果を戻り値として返す。

例外

fのargs...による関数呼び出しに際して例外を投げない(is_nothrow_invocable_v<F, Args...> == true)ならば、この関数も例外を投げない。

例

#include <iostream>
#include <functional>

struct functor {
  auto operator()() -> int {
    return 10;
  }

  auto operator()(int n) -> int {
    return n;
  }
};

struct has_member {
  auto member_function(int n) -> int {
    return n;
  }

  int member_object;
};

auto f(int) -> double {
  return 3.14159265359;
}

auto g(int) -> double {
  return 2.71828182846;
}

auto g(int,int) -> double {
  return 3.14159265359;
}


int main()
{
  functor fobj{};

  //関数オブジェクト呼び出し
  std::cout << std::invoke(fobj) << std::endl;
  std::cout << std::invoke(fobj, 100) << std::endl;

  has_member obj{25};
  //メンバ関数呼び出し
  std::cout << std::invoke(&has_member::member_function, obj, 50) << std::endl;
  //メンバ変数呼び出し
  std::cout << std::invoke(&has_member::member_object, obj) << std::endl;

  auto ref = std::ref(obj);
  //reference_wrapperからのメンバ関数呼び出し
  std::cout << std::invoke(&has_member::member_function, ref, 50) << std::endl;
  //reference_wrapperからのメンバ変数呼び出し
  std::cout << std::invoke(&has_member::member_object, ref) << std::endl;

  //関数呼び出し
  std::cout << std::invoke(f, 10) << std::endl;

  //フリー関数は一度関数ポインタにしないとオーバーロード解決できない
  std::cout << std::invoke((double(*)(int))g, 10) << std::endl;
  std::cout << std::invoke((double(*)(int, int))g, 10, 10) << std::endl;

  //コンパイルエラー
  //std::cout << std::invoke(g, 10) << std::endl;
}

出力

10
100
50
25
50
25
3.14159
2.71828
3.14159

バージョン

言語

  • C++17

処理系

  • Clang: 9.0.1 ✅
  • GCC: ??
  • Visual C++: 2015 ✅, 2017 ✅

関連項目

  • invoke_r
  • invoke_result
  • is_invocable
  • is_nothrow_invocable

参照

  • C++1z INVOKEコンセプトに従った関数呼び出しをするinvoke()関数 - Faith and Brave - C++で遊ぼう
  • N4169 A proposal to add invoke function template (Revision 1)
  • LWG Issue 2807. std::invoke should use std::is_nothrow_callable
    • C++17で、invokeにnoexcept(is_nothrow_invocable_v<F, Args...>)の例外指定が追加された
  • P1065R2 constexpr INVOKE
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.