当前位置: 首页 > 知识库问答 >
问题:

继承函数的重载解析

聂建茗
2023-03-14

我希望有一个结构,它接受任意数量的lambdas,并作为所有调用操作符的中心调用点。

如果使用与构造时给出的任何 lambda 不匹配的参数列表调用调用运算符,则应调用默认调用运算符。

我以为下面的代码可以完全做到这一点。每个 lambda 的调用运算符都通过使用“提升”到 Poc

template <typename ...Lambdas>
struct Poc : Lambdas...
{
    using Lambdas::operator() ...; // Lift the lambda operators into the class

    template <typename ...Ts>
    auto operator() (Ts...)
    {
        std::cout << "general call" << std::endl;
    }
};

// Deduction guide
template <typename ...Ts>
Poc(Ts... ts)->Poc<Ts...>;

int main()
{
    auto l_int = [](int) {std::cout << "int" << std::endl; };

    Poc poc{l_int};
    poc(1);//calls the default operator. why?

    return 0;
}

当我在结构中没有默认的call操作符时,一切都像预期的那样工作(使用有效的参数列表)。如果我将它添加到结构中(如上面的代码所示),默认操作符每次都会被调用,不管我用哪个参数调用它。

在我的理解中,lambda-call-operators和structs(默认)call-operators出现在同一个作用域中。因此,它们都应该被视为过载解决方案。因为lamdba-操作符比通用的默认操作符更具体,所以应该选择它。

显然情况并非如此。为什么会这样?

我在Microsoft Visual C、Clang和GCC上进行了测试(都是最新版本)。

编辑:

  • MSVC 15.8.9
  • GCC 9.0.0(通过Wandbox)
  • Clang 8.0.0(通过Wandbox)

共有1个答案

单嘉泽
2023-03-14

当您发现它时,这很简单:您的运算符不具有常量资格,而lambda的运算符是(除非您将lambda定义为可变)。因此,它更适合您的非常量 Poc 实例

只需添加缺少的< code>const:

auto operator() (Ts...) const
 类似资料:
  • 这可能是一个很难回答的问题,很抱歉。我最近遇到了一个奇怪的问题,当我试图在C++中处理一些高级的东西时,函数重载和继承。 我将展示一个简单的例子,只是为了演示问题; 有两个类,和,如下所示; 据我所知,现在应该有两个函数,由于不同的参数而被重载。 但在main方法中尝试这一点时; 它给出了错误,因为超类中的方法在派生类中不可见。 我怎样才能克服这些呢?在C++中重载不就是这样工作的吗?我是C++新

  • 我试图重写模板类http://docs.ros.org/hydro/api/rviz/html/c/message__filter__display_8h_source.html使用多种消息类型,使用变量模板。 我的第一个问题是如何使用可变模板重写下面的示例代码,以便它可以用于任意数量的模板参数,而不仅仅是2个。 我需要在家长类: 每个模板类型的虚拟成员函数 每个模板类型的每个的成员函数 每个模板

  • 人们有时会对类成员函数或成员变量的作用域问题感到困惑,尤其是,当基类与派生类的同名成员不在同一个作用域内时: struct B { void f(double); }; struct D : B { void f(int); }; B b; b.f(4.5); // OK // 调用的到底是B::f(doube)还是D::f(int)呢? // 实际情况往往会让人感到意外

  • 本文向大家介绍解析Java继承中方法的覆盖和重载,包括了解析Java继承中方法的覆盖和重载的使用技巧和注意事项,需要的朋友参考一下 方法的覆盖 在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称、返回值类型、参数列表。   如果在新类中定义一个方法,其名称、返回值类型和参数列表正好与父类中的相同,那么,新方法被称做覆盖旧方法。   参数列

  • FAQs in section [20]: [20.1] 什么是“虚成员函数”? [20.2] C++ 怎样同时实现动态绑定和静态类型? [20.3] 虚成员函数和非虚成员函数调用方式有什么不同? [20.4] 析构函数何时该时虚拟的? [20.5] 什么是“虚构造函数(virtual constructor)”? 20.1 什么是“虚成员函数”? 从面向对象观点来看,它是 C++ 最重要的特征:

  • 正如节点可以从其他节点继承一样,这可以为相似的节点复制很多代码, 同样的思想也可以用于类。 例如,假设你有一个管理 Apache Web 服务器的 apache 类, 你想要使用略有不同的配置文件设置一台新的 Apache 机器 — 也许是监听的端口不同。 你可以复制整个 apache 类,除了配置文件。另外,你可以从 apache 类中提取配置文件并创建两个新类,每个新类都包含 apache 基