gpt4 book ai didi

c++ - 如何为模板化 operator() 编写最好的 is_callable 特性

转载 作者:可可西里 更新时间:2023-11-01 15:23:43 24 4
gpt4 key购买 nike

我有这样定义的 is_callable 特性:

#ifndef IS_CALLABLE_HPP
#define IS_CALLABLE_HPP

#include <type_traits>

namespace is_callable_detail
{
struct no {};
struct yes { no x[2]; };

template<bool CallableArgs, typename Callable, typename ReturnType, typename ...Args>
struct check_return
{
static const bool value = std::is_convertible<decltype(std::declval<Callable>()(std::declval<Args>()...)), ReturnType>::value;
};

template<typename Callable, typename ReturnType, typename ...Args>
struct check_return<false, Callable, ReturnType, Args...>
{
static const bool value = false;
};
}

template<typename Callable, typename Function>
struct is_callable;

template<typename Callable, typename ReturnType, typename ...Args>
struct is_callable<Callable, ReturnType(Args...)>
{
private:
template<typename T>
static is_callable_detail::yes check(decltype(std::declval<T>()(std::declval<Args>()...)) *);
template<typename T>
static is_callable_detail::no check(...);

static const bool value_args = sizeof(check<Callable>(nullptr)) == sizeof(is_callable_detail::yes);
static const bool value_return = is_callable_detail::check_return<value_args, Callable, ReturnType, Args...>::value;
public:
static const bool value = value_args && value_return;
};

#endif // IS_CALLABLE_HPP

我的问题是如何检测没有参数且只有返回类型 T 的模板化 operator()

template<typename T>
T operator()()
{
// ...
}

template<typename T, typename U>
auto operator()() -> decltype(std::declval<T>() + std::declval<U>())
{
// ...
}

我知道这种情况很少见,但我想问一下,有没有什么方法可以检测不带参数且带有一个或多个模板参数的模板化 operator() 的存在。

最佳答案

如果提前知道operator()不会重载,可以尝试取其地址。如果operator()可能 重载,那么一个肯定的结果将意味着有一个 operator()存在但阴性结果意味着要么没有 operator()存在,或者至少有两个重载。

请注意,模板将(如预期的那样)带来多个 operator() 的重载。 .但是,如果您确实知道非默认模板参数的数量,您可以尝试使用 operator()<T> 的地址。 (对于某些类型 T希望 不会触发 SFINAE)。

最后一点,我建议不要在不知道要传递什么参数的情况下尝试花太多时间检查仿函数(或成员函数,出于同样的原因),就像您已经拥有的一样。 C++11 使得编写和使用在表达式级别运行的通用代码变得非常容易。

关于c++ - 如何为模板化 operator() 编写最好的 is_callable 特性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9231247/

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