在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>);
}
问题是必须如何填写“ ???”使它起作用?
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
,模板或采用默认参数的好处。
我刚刚意识到正确的语法是:
static_assert(std::is_invocable_r_v<size_t, decltype(&A::size), A, double>);