is_invocable、is_invocable_r、is_nothrow_invocable、is_nothrow_invocable_r類別
這些範本會決定是否可以使用指定的自變數類型來叫用類型。 is_invocable_r
和 is_nothrow_invocable_r
也會判斷調用的結果是否可轉換成特定類型。 is_nothrow_invocable
和 is_nothrow_invocable_r
也會判斷叫用是否已知不會擲回例外狀況。 已在 C++17 中新增。
語法
template <class Callable, class... Args>
struct is_invocable;
template <class Convertible, class Callable, class... Args>
struct is_invocable_r;
template <class Callable, class... Args>
struct is_nothrow_invocable;
template <class Convertible, class Callable, class... Args>
struct is_nothrow_invocable_r;
// Helper templates
template <class Callable, class... Args>
inline constexpr bool is_invocable_v =
std::is_invocable<Callable, Args...>::value;
template <class Convertible, class Callable, class... Args>
inline constexpr bool is_invocable_r_v =
std::is_invocable_r<Convertible, Callable, Args...>::value;
template <class Callable, class... Args>
inline constexpr bool is_nothrow_invocable_v =
std::is_nothrow_invocable<Callable, Args...>::value;
template <class Convertible, class Callable, class... Args>
inline constexpr bool is_nothrow_invocable_r_v =
std::is_nothrow_invocable_r<Convertible, Callable, Args...>::value;
參數
調用
要查詢的可呼叫類型。
Args
要查詢的自變數類型。
可轉換
可呼叫結果的類型必須可轉換成 。
備註
如果可以使用未評估內容中的自變數 Args 來叫用可呼叫的類型 Callable,則is_invocable
類型述詞會保留 true。
is_invocable_r
如果可以使用未評估內容中的自變數 Args 來叫用可呼叫類型 Callable,則類型述詞會保留 true,以產生可轉換成可轉換的結果類型。
is_nothrow_invocable
如果可在未評估的內容中使用自變數 Args 叫用可呼叫的類型,而且已知這類呼叫不會擲回例外狀況,則類型述詞會保留 true。
is_nothrow_invocable_r
如果可以使用未評估內容中的自變數 Args 來叫用可呼叫的類型可呼叫,以產生可轉換成可轉換的結果類型,而且已知這類呼叫不會擲回例外狀況,則類型述詞會保留 true。
每個可轉換、可呼叫的類型和參數套件 Args 中的類型都必須是完整類型、未知系結的數位,或可能為 cv 限定的 void
。 否則,述詞的行為是未定義的。
範例
// std__type_traits__is_invocable.cpp
// compile using: cl /EHsc /std:c++17 std__type_traits__is_invocable.cpp
#include <type_traits>
auto test1(int) noexcept -> int (*)()
{
return nullptr;
}
auto test2(int) -> int (*)()
{
return nullptr;
}
int main()
{
static_assert( std::is_invocable<decltype(test1), short>::value );
static_assert( std::is_invocable_r<int(*)(), decltype(test1), int>::value );
static_assert( std::is_invocable_r<long(*)(), decltype(test1), int>::value ); // fails
static_assert( std::is_nothrow_invocable<decltype(test1), int>::value );
static_assert( std::is_nothrow_invocable<decltype(test2), int>::value ); // fails
static_assert( std::is_nothrow_invocable_r<int(*)(), decltype(test1), int>::value );
static_assert( std::is_nothrow_invocable_r<int(*)(), decltype(test2), int>::value ); // fails
}
需求
標頭:<type_traits>
命名空間:std