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_invocableのapply版である。
要件
型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
処理系
- Clang: 22 ❌
- GCC: 15 ❌
- Visual C++: 2026 Update 2 ❌