微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

检查函数模板是否可调用

如何解决检查函数模板是否可调用

我有一个函数模板,如下面的最小片段所示。我想在拨打电话之前测试它是否可以调用

#include <concepts>

void f(auto a) {}
// void f(int a) {} // This is ok

static_assert(std::invocable<decltype(f),int>);

但它没有编译错误

error: 'decltype' cannot resolve address of overloaded function

或者,

void f(auto a) {}

template <auto F> concept callable = requires { {F(27)}; };

static_assert(callable<f>);

报错

error: unable to deduce 'auto' from 'f'

这是 C++20 语言的限制吗?有没有办法强制实例化 f<int>?是否有其他方法可以在不更改 f 的情况下编译检查?

解决方法

函数模板只能在您调用它时执行模板参数推导。因此,如果您不调用它,那么您可以使用函数模板名称做的唯一事情就是为其提供所需的模板参数(从而解析为实际函数)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。