c++ - 继承函数的重载解决方案

标签 c++ templates inheritance lambda overloading

我想要一个结构体,它接受任意数量的 lambda,并作为所有调用运算符的中心调用点。

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

我认为下面的代码完全可以做到这一点。通过 using 将每个 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;
}

当结构中没有默认调用运算符时,一切都按预期工作(使用有效的参数列表)。如果我将它添加到结构中(如上面的代码中所示),则每次都会调用默认运算符,无论我使用哪个参数调用它。

据我了解,lambda-call-operators 和 structs(默认)call-operator 存在于同一范围内。因此,它们都应该被视为重载解决方案。由于 lamdba-operator 比通用默认操作符更具体,因此应该选择它。

显然情况并非如此。这是为什么呢?

我在 Microsoft Visual C++ 上测试过, ClangGCC (全部都是最新版本)。

编辑:

最佳答案

当您发现它时很简单:您的运算符不是const-合格的,而the lambda's one是(除非您将 lambda 定义为 mutable)。因此,它更适合您的 Poc 的非常量实例。

只需添加缺少的const:

auto operator() (Ts...) const

关于c++ - 继承函数的重载解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53173336/

相关文章:

C++: error LNK2019: 未解析的外部符号 __snprintf 在函数中引用

c++ - 不死的斐波那契兔子

c++接口(interface)告诉我我的参数尚未声明

c++ - 如何返回可选指针或引用( std::Optional )?

c++ - 成员属性的 std::function 模板参数推导

c++ - 具有重载运算符的指针数组

c++ - 如何用 C++ 编写通用转换函数?

c++ - 在多级继承中从中间类调用派生类函数而不将其标记为虚拟

java - 从类方法显示类对象

c# - Unity中的自定义编辑器继承