【发布时间】:2021-06-23 08:06:05
【问题描述】:
我想制作一个实用程序,允许将多个 lambda 表达式组合成一个重载的仿函数。在 C++17 中其实很简单,只需要 5 行代码:
template <typename... Funcs>
struct overload : public Funcs... {
using Funcs::operator()...;
constexpr overload(Funcs&&... funcs) noexcept : Funcs{funcs}... {}
};
我想知道为什么需要使用声明?最初,当我写这篇文章时,我没有包含 using Funcs::operator()...; 行,编译器 (GCC) 抱怨 operator()() 模棱两可。
为什么这里需要使用声明?据我所知,类内使用声明用于在派生类中生成基类public 的protected 成员。由于 lambda 类型已经将 operator()() 声明为 public,因此 using 声明不应该有所作为。
Here is an example usage code (godbolt):
auto f = overload{
[](int){return "int ";},
[](char){return "char ";},
[](float){return "float ";},
[](){return "void ";}
};
std::cout << f(3) << f('a') << f();
【问题讨论】:
-
struct A{ void f(int);}; struct B{ void f();}; struct C : A, B {}; C c; c.f();也会有歧义。
标签: c++ inheritance lambda overloading using