gpt4 book ai didi

c++ - 查明 C++ 对象是否可调用

转载 作者:IT老高 更新时间:2023-10-28 12:42:42 26 4
gpt4 key购买 nike

是否可以编写类型特征,例如 is_callable<T>它告诉对象是否有 operator()定义?如果事先知道调用运算符的参数很容易,但不是在一般情况下。当且仅当至少定义了一个重载调用运算符时,我希望特征返回 true。

This question是相关的并且有一个很好的答案,但它不适用于所有类型(仅适用于 int -可转换类型)。另外,std::is_function有效,但仅适用于正确的 C++ 函数,而不适用于仿函数。我正在寻找更通用的解决方案。

最佳答案

我认为这个特性可以满足您的需求。它检测具有任何类型签名的 operator(),即使它已重载并且是否已模板化:

template<typename T>
struct is_callable {
private:
typedef char(&yes)[1];
typedef char(&no)[2];

struct Fallback { void operator()(); };
struct Derived : T, Fallback { };

template<typename U, U> struct Check;

template<typename>
static yes test(...);

template<typename C>
static no test(Check<void (Fallback::*)(), &C::operator()>*);

public:
static const bool value = sizeof(test<Derived>(0)) == sizeof(yes);
};

原理基于Member Detector idiom .实际上,如果您将其传递给非类类型,它将无法编译,但这应该不难修复,为了简洁起见,我只是将其省略了。您还可以将其扩展为对函数报告 true。

当然,它不会给你任何关于 operator() 签名的信息,但我相信这不是你想要的,对吧?

编辑 Klaim :

它很简单,可以使用非类类型(返回 false)。如果把上面的类重命名为is_callable_impl,可以这样写,例如:

template<typename T>
struct is_callable
: std::conditional<
std::is_class<T>::value,
is_callable_impl<T>,
std::false_type
>::type
{ };

关于c++ - 查明 C++ 对象是否可调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15393938/

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