分享方式:


is_invocable、is_invocable_r、is_nothrow_invocable、is_nothrow_invocable_r類別

這些範本會決定是否可以使用指定的自變數類型來叫用類型。 is_invocable_ris_nothrow_invocable_r 也會判斷調用的結果是否可轉換成特定類型。 is_nothrow_invocableis_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

另請參閱

<type_traits>
調用