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

问题描述 投票:0回答:2

在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>);  
}

问题是必须如何填写“ ???”使它起作用

c++ c++17 metaprogramming typetraits
2个回答
1
投票

使用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,模板或采用默认参数的好处。


0
投票

我刚刚意识到正确的语法是:

static_assert(std::is_invocable_r_v<size_t, decltype(&A::size), A, double>); 
© www.soinside.com 2019 - 2024. All rights reserved.