gpt4 book ai didi

c++ - 用于测试任意方法是否存在的 std::is_invocable 语法(不仅仅是 operator())

转载 作者:太空宇宙 更新时间:2023-11-04 15:29:10 26 4
gpt4 key购买 nike

在 C++17 中我知道我可以写:

#include <type_traits>

struct A
{
size_t operator()(double x) const { return 1; };
};

int main()
{
static_assert(std::is_invocable_r_v<size_t, A, double>);
}

但是现在我想使用 std::is_invocable测试任意方法的存在(这里是 size(double) 方法):

#include <type_traits>

struct A
{
size_t size(double x) const { return 1; };
};

int main()
{
static_assert(std::is_invocable_r_v<size_t, ???, double>);
}

问题是必须如何填写“???”让它工作 ?

最佳答案

使用 detection idiom :

template <typename T, typename... Args>
using call_size_t = decltype(std::declval<T>().size(std::declval<Args>()...);

template <typename R, typename T, typename... Args>
using is_size_callable = is_detected_convertible<R, call_size_t, T, Args...>;

static_assert(is_size_callable<size_t, A, double>::value);

这有利于使用重载的成员函数 size、模板或采用默认参数。


C++20 中的概念:

template <typename T, typename R, typename... Args>
concept is_size_callable = requires (T t, Args... args) {
{ t.size(std::forward<Args>(args)...) } -> std::convertible_to<R>;
};

static_assert(is_size_callable<A, size_t, double>);

我翻转了参数以将 T 放在第一位,因为这将允许 type-constraint 语法:

template <is_size_callable<size_t, double> T>
void foo(T );

foo(A{});

关于c++ - 用于测试任意方法是否存在的 std::is_invocable 语法(不仅仅是 operator()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59160409/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com