c++ - 如何避免本地 lambda 影子重载解析?

标签 c++ lambda c++14

这是通过 4 层间接发生的事情的精简版本。重叠解析在同名的本地 lambda 附近失效。这是某种维护问题,特别是如果代码仍然可以构建(这里不是)并且错误仅在测试中捕获。

有没有一种优雅的方法来规避这个问题?请参阅Godbolt Playgound对于这个问题。

#include "catch.hpp"

#include <iostream>
#include <map>
#include <string>

namespace {

struct Something {};

template <typename T>
void process(const T& x, Something const& s){}

struct A {
};

void process(A const& p, Something const& s){}

struct B {
};

void process(B const& p, Something const& s){}
} // namespace

int main {
    struct C {};

    // THIS lanbda shadows the visibility of formerly defined
    // functions with same name. This is a maintainability issue
    auto process = [](C const& p, Something const& s) {};

    Something s{};

    A a{};
    B b{};
    C c{};

    process(a, s);
    process(b, s);
}

最佳答案

您可能会明确指出过载:

// C++17 implementation, might have similar code for C++11/C++14
template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;

然后:

auto process = overloaded{
    [](C const& p, Something const& s) {},
    [](const auto& p, Something const& s){::process(p, s);}
};

Demo

关于c++ - 如何避免本地 lambda 影子重载解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49027536/

相关文章:

具有静态类成员的 C++ 模板类

c++ - 直接覆盖 map::compare 与 lambda 函数

java - javac生成的名称中的$$是什么意思?

c++ - 如何通过 memcpy 将可 move 类型推送到/从遗留的基于 C 的容器中弹出?

c++ - 如何将正确的库与 GLFW 链接为 cmake 中的外部项目?

c++ - 错误 : 'QGeoCoordinate' does not name a type

c++ - 唯一指针映射,带有原始指针的 .at()

c# - 等效的 lambda 值是多少?

使用模板的 C++ 惰性求值

c++ - std::result_of 参数类型