gpt4 book ai didi

c++ - 为什么 SFINAE 不起作用?

转载 作者:行者123 更新时间:2023-11-30 03:33:37 25 4
gpt4 key购买 nike

我想检查类是否有 operator()。我尝试了以下 SFINAE。

#include <type_traits>  //for std::true_type/false_type
#include <utility> //for std::declval

template <typename T, typename... A>
class has_call_operator {
private:
template <typename U, typename... P>
static auto check(U u, P... p) -> decltype(u(p...), std::true_type());
static auto check(...) -> decltype(std::false_type());

public:
using type
= decltype(check(std::declval<T>(), std::declval<A>()...));
static constexpr bool value = type::value;
};

一眼看去,它工作正常。

#include <iostream>

struct test {
void operator()(const int x) {}
};

int main()
{
std::cout << std::boolalpha << has_call_operator<test, int>::value << std::endl; //true
return 0;
}

但是,抽象类并没有被它正确地工作。

#include <iostream>

struct test {
void operator()(const int x) {}
virtual void do_something() = 0;
};

int main()
{
std::cout << std::boolalpha << has_call_operator<test, int>::value << std::endl; //false
return 0;
}

为什么这段代码不起作用?另外,你能让这段代码工作吗?

最佳答案

您按值获取 U,因此它还需要类型的构造。

通过 const 引用传递来解决这个问题。

你可以看看is_detected并有类似的东西:

template <typename T, typename ...Ts>
using call_operator_type = decltype(std::declval<T>()(std::declval<Ts>()...));

template <typename T, typename ... Args>
using has_call_operator = is_detected<call_operator_type, T, Args...>;

关于c++ - 为什么 SFINAE 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42684308/

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