代码之家  ›  专栏  ›  技术社区  ›  ZachB

C++lambda或基于lambda签名的重载解析中的可选/忽略参数

  •  1
  • ZachB  · 技术社区  · 5 年前

    我有这样一个迭代助手:

    template <typename T, typename Op>
    void for_each(T* a, size_t n, Op op) {
        for (size_t i = 0; i < n; i++) {
            a[i] = op(a[i], i);
        }
    }
    

    i 参数到 op :

    // float* a;
    for_each(a, n, [](const float& v) { return v + 1; });
    for_each(a, n, [](const float& v, const size_t& i) { return v + i; });
    

    注意:我没有选择使用 (const float& v, size_t) { } 忽略第二个参数,也不选择更改 op公司 签名至 std::pair<T, size_t>

    1 回复  |  直到 5 年前
        1
  •  0
  •   Jarod42    5 年前

    有了SFINAE,你可能会

    template <typename T, typename Op>
    auto for_each(T* a, size_t n, Op op) -> decltype(op(a[n], n), void()){
        for (size_t i = 0; i < n; i++) {
            a[i] = op(a[i], i);
        }
    }
    template <typename T, typename Op>
    auto for_each(T* a, size_t n, Op op) -> decltype(op(a[n]), void()){
        for (size_t i = 0; i < n; i++) {
            a[i] = op(a[i]);
        }
    }