c++ - 如何限制 C++17 模板参数中的 lambda 签名?

标签 c++ templates lambda constraints c++17

假设我有两个函数接收不同的 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/

相关文章:

C++ "pause: not found"无系统 ("pause")

c++ - 扩展 CRTP 模板功能

c# - 检查 IEnumerable<T> 是否有 5 个或更多匹配项

c++ - 如何从捕获移动的lambda表达式中创建std::function?

c++ - 以理智、安全和有效的方式复制文件

c++ - 将数组 (&) 传递给函数 c++,运行时错误

c++ - 是否有围绕 Win32 的无锁 SList 的合适的 C++ 包装器?

c++ - 为什么 std::bind() 在这种情况下不适用于常量?

c++ - 模板类中嵌套类的问题

Python lambda 函数列表