假设我有两个函数接收不同的 lambda 类型作为参数:
template<typename F>
void func1(F&& lambda) {
// lambda must be [](unsigned int) -> short
}
template<typename F>
void func2(F&& lambda) {
// lambda must be [](const vector<string>&) -> void
}
我如何在 C++17 中限制这些 lambda 签名,以准确匹配我在每种情况下的需要?
最佳答案
C++20 之前:
template<typename F, typename = std::enable_if_t<
std::is_invocable_v<F, unsigned int>
>>
void func1( F &&lambda ) {
// lambda must be [](unsigned int) -> short
}
C++20:
template<typename F>
requires std::is_invocable_v<F, unsigned int>
void func1( F &&lambda ) {
// lambda must be [](unsigned int) -> short
}
如果您还想验证返回类型,请使用 std::is_invocable_r_v。
[编辑]
...使用 std::is_invocable_r_v
template<typename F, typename = std::enable_if_t<
std::is_invocable_r_v<short, F, unsigned int>
>>
void func1( F &&lambda ) {
// lambda must be [](unsigned int) -> short
}
关于c++ - 如何限制 C++17 模板参数中的 lambda 签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64029445/