最終更新日時(UTC):
が更新

履歴 編集

class template
<type_traits>

std::is_invocable(C++17)

namespace std {
  template <class F, class... ArgsTypes>
  struct is_invocable;

  template <class F, class... ArgsTypes>
  inline constexpr bool is_invocable_v = std::is_invocable<F, ArgsTypes...>::value;
}

概要

Fが、与えられた型の引数ArgsTypes...で関数呼び出し可能かどうかを調べる。

要件

FおよびArgsTypes...パラメータパックの全ての型が、完全型であること。もしくはconst/volatile修飾された(あるいはされていない)voidか、要素数不明の配列型であること。

効果

Fに対して引数ArgsTypes...によるINVOKEコンセプトに従った呼び出しが可能であればtrue_typeから派生し、そうでなければfalse_typeから派生する。

結果がtrueとなる場合、以下のような呼び出しが可能であるということと等価である:

std::invoke(std::declval<F>(), std::declval<ArgsTypes>()...)

#include <type_traits>
#include <vector>
#include <string>
#include <iostream>


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

  auto operator()(int, double) -> std::string {
    return "string";
  }
};

struct has_member {
  auto member_function(std::vector<char>) -> short {
    return 0;
  }

  int member_object;
};

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


int main()
{
  std::cout << std::boolalpha;

  //trueとなる呼び出し

  //has_member.*(has_member::*member_function, std::vector<char>)
  std::cout << std::is_invocable<decltype(&has_member::member_function), has_member, std::vector<char>>::value << std::endl;

  //(*(has_member*)).*(has_member::*member_function, std::vector<char>)
  std::cout << std::is_invocable<decltype(&has_member::member_function), has_member*, std::vector<char>>::value << std::endl;

  //has_member.*(has_member::*member_object)
  std::cout << std::is_invocable<decltype(&has_member::member_object), has_member>::value << std::endl;

  //(*(has_member*)).*(has_member::*member_object)
  std::cout << std::is_invocable<decltype(&has_member::member_object), has_member*>::value << std::endl;

  //functor::operator()()
  std::cout << std::is_invocable<functor>::value << std::endl;

  //functor::operator()(int, double)
  std::cout << std::is_invocable<functor, int, double>::value << std::endl;

  //f(int)
  std::cout << std::is_invocable<decltype(f), int>::value << std::endl;


  //falseとなる呼び出し(いずれも定義されていない)

  //has_member.*(has_member::*member_function, int)
  std::cout << std::is_invocable<decltype(&has_member::member_function), has_member, int>::value << std::endl;

  //functor::operator()(std::string)
  std::cout << std::is_invocable<functor, std::string>::value << std::endl;

  //f(const char*)
  std::cout << std::is_invocable<decltype(f), const char*>::value << std::endl;
}

出力

true
true
true
true
true
true
true
false
false
false

バージョン

言語

  • C++17

処理系

参照