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

履歴 編集

class template
<type_traits>

std::is_applicable(C++26)

namespace std {
  template <class F, class Tuple>
  struct is_applicable;

  template <class F, class Tuple>
  inline constexpr bool is_applicable_v = std::is_applicable<F, Tuple>::value;
}

概要

関数呼び出し可能な型Fに対して、tuple-likeな型Tupleの要素を展開してapplyによる呼び出しが可能かどうかを調べる。

is_invocableapply版である。

要件

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

効果

ELEMS-OF(T)を、make_index_sequence<tuple_size_v<remove_reference_t<T>>>が示すindex_sequenceの特殊化のテンプレート引数であるsize_tのパラメータパックNに対する、パラメータパックget<N>(declval<T>())とする。

tuple-like<Tuple>trueであり、かつ式INVOKE(declval<F>(), ELEMS-OF(Tuple)...)が未評価オペランドとして扱われたときに適格であるならばtrue_typeから派生し、そうでなければfalse_typeから派生する。

#include <tuple>
#include <type_traits>
#include <string>
#include <iostream>

int add(int a, int b) { return a + b; }
void no_args() {}

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

  // add(int, int) に tuple<int, int> を展開して呼び出し可能
  std::cout << std::is_applicable_v<decltype(&add), std::tuple<int, int>> << std::endl;

  // add(int, int) に tuple<int> では引数が足りない
  std::cout << std::is_applicable_v<decltype(&add), std::tuple<int>> << std::endl;

  // no_args() に空のタプルで呼び出し可能
  std::cout << std::is_applicable_v<decltype(&no_args), std::tuple<>> << std::endl;

  // no_args() に tuple<int> は引数が多すぎる
  std::cout << std::is_applicable_v<decltype(&no_args), std::tuple<int>> << std::endl;
}

出力

true
false
true
false

バージョン

言語

  • C++26

処理系

関連項目

参照