gpt4 book ai didi

c++ - 检查 operator() 是否存在

转载 作者:太空狗 更新时间:2023-10-29 20:01:36 24 4
gpt4 key购买 nike

我需要一个类型特征 HasCall 来检查 T 的以下类型实例化的有效性:

template<class T> struct Caller: T
{
using T::operator();
};

有没有办法在 C++14 中做到这一点?这是我的尝试,但它不起作用: https://godbolt.org/z/vxgJCR

编辑

我了解 SFINAE 及其运作方式。这个问题比仅仅检查某些表达式的有效性更困难。我希望这些断言通过:

struct A {void operator()(int) {}};
static_assert(HasCall<A>, "Check must work with any set of arguments.");

struct B {void operator()() {}};
static_assert(HasCall<B>, "Check must work with any set of arguments.");

struct C {template<typename... Args> void operator()(Args&&...) {}};
static_assert(HasCall<C>, "Templated operators must be detected correctly.");

struct D {};
static_assert(!HasCall<D>, "No operator() at all.");

static_assert(!HasCall<void(*)()>, "Class cannot inherit from function pointers.");

检查表达式 &T::operator() 的有效性是不够的,因为它不适用于重载或模板 operator()。

请使用这些断言检查您的解决方案。

这个问题不是重复的。

最佳答案

不,没有办法做到这一点。

所有解决方案都需要知道调用的签名(准确的或兼容的),或者不依赖于重载。

事实上,任何重载或模板调用运算符都无法可靠地检测到,即使您具有已知的签名,因为隐式转换为函数指针允许欺骗 declval 测试。

您将不得不找到解决问题的另一种方法,或者等待反射(reflection)。

关于c++ - 检查 operator() 是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56718264/

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