我有一个函数模板,如下所示。我想在打电话之前测试它是否可调用:
#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
的情况下编译检查?
函数模板只有在调用它时才能执行模板参数推导。因此,如果您不调用它,那么使用函数模板名称所能做的唯一事情就是为它提供所需的模板参数(从而解析为实际函数(。