gpt4 book ai didi

c++ - 如何检查类型是否存在无参数运算符()

转载 作者:可可西里 更新时间:2023-11-01 18:26:48 26 4
gpt4 key购买 nike

我正在尝试检查仿函数是否与给定的一组参数类型和给定的返回类型兼容(也就是说,给定的参数类型可以隐式转换为实际的参数类型,而返回类型则相反) .目前我为此使用以下代码:

    template<typename T, typename R, template<typename U, typename V> class Comparer>
struct check_type
{ enum {value = Comparer<T, R>::value}; };

template<typename T, typename Return, typename... Args>
struct is_functor_compatible
{
struct base: public T
{
using T::operator();
std::false_type operator()(...)const;
};
enum {value = check_type<decltype(std::declval<base>()(std::declval<Args>()...)), Return, std::is_convertible>::value};
};

check_type<T, V, Comparer>这在大多数情况下工作得很好,但是当我测试像 struct foo{ int operator()() const;}; 这样的无参数仿函数时它无法编译。 ,因为在那种情况下,两个 operator()的 base 显然是模棱两可的,导致这样的事情:

error: call of '(is_functor_compatible<foo, void>::base) ()' is ambiguous
note: candidates are:
note: std::false_type is_functor_compatible<T, Return, Args>::base::operator()(...) const [with T = foo, Return = void, Args = {}, std::false_type = std::integral_constant<bool, false>]
note: int foo::operator()() const

很明显,我需要一种不同的方法来检查无参数仿函数。我尝试对 is_functor_compatible 进行部分特化对于空参数包,我检查 &T::operator() 的类型是一个无参数的成员函数,它或多或少起作用。然而,当被测试的仿函数有多个 operator() 时,这种方法显然失败了。 .

因此我的问题是是否有更好的方法来测试无参数 operator() 的存在以及如何去做。

最佳答案

当我想测试一个给定的表达式是否对一个类型有效时,我使用类似于这个的结构:

template <typename T>
struct is_callable_without_parameters {
private:
template <typename T1>
static decltype(std::declval<T1>()(), void(), 0) test(int);
template <typename>
static void test(...);
public:
enum { value = !std::is_void<decltype(test<T>(0))>::value };
};

关于c++ - 如何检查类型是否存在无参数运算符(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7905905/

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