【问题标题】:C++: conversion from overloaded function to std::functionC++:从重载函数到 std::function 的转换
【发布时间】:2019-12-26 09:56:18
【问题描述】:

我有一个 C++ 函数,它接受另外两个函数作为参数:

// ParseResult is a class with a default constructor (no arguments)
ParseResult* bin_op(std::function<ParseResult*()> func_a, std::vector<std::string> ops, std::function<ParseResult*()> func_b);

当我通过以下方式调用此函数时:

bin_op(func_1, {"MOD"}, func_2);
// Both func_1 and func_2 are of type ParseResult*, and take in no parameters

编译器抛出此错误:

no known conversion for argument 1 from '<unresolved overloaded function type>' to 'std::function<ParseResult*()>

我的代码编辑器显示如下:

no suitable constructor exists to convert from "ParseResult *()" to "std::function<ParseResult *()>"

std::function 包含在代码中。

我该怎么办?我已经尝试使用模板和函数指针来解决这个问题,但我没有这样做。

  • 操作系统:Windows 10 64 位
  • 编译器:g++ 8.2.0

编辑: 这是代码库的简化版本:

#include <iostream>
#include <vector>
#include <functional>

class ParseResult {
    public:
        ParseResult() {}
};

class Parser {
    public:
        ParseResult* c;
        ParseResult* bin_op(std::function<ParseResult*()> func_a, std::vector<std::string> ops, std::function<ParseResult*()> func_b);
        ParseResult* func_1();
        ParseResult* func_2();

        Parser() {
            c = bin_op(static_cast<ParseResult*(*)()>(func_1), {"MOD"}, static_cast<ParseResult*(*)()>(func_2));
        }
};

ParseResult* Parser::func_1() { return new ParseResult(); }
ParseResult* Parser::func_2() { return new ParseResult(); }

ParseResult* Parser::bin_op(std::function<ParseResult*()> func_a, std::vector<std::string> ops, std::function<ParseResult*()> func_b) {
    ParseResult* a = func_a();
    ParseResult* b = func_b();
    return a;
}

int main() {
    parser = new Parser();
    std::cout << parser->c;
}

【问题讨论】:

    标签: c++ std-function


    【解决方案1】:

    func_1func_2 是非静态成员函数;他们需要调用对象。您可以通过捕获this 将它们包装到lambdas 中。例如

    c = bin_op([this]() { return func_1(); }, {"MOD"}, [this]() { return func_2(); });
    

    LIVE

    【讨论】:

    • 我在尝试您的解决方案时收到以下错误:invalid static_cast from type '&lt;unresolved overloaded function type&gt;' to type 'ParseResult* (*)()'
    • @Bonfire 请提供mcve 可以重现错误;我试过一个here
    • @Bonfire 您可能需要找出实际代码中的实际问题..
    • @Bonfire 答案已修改。
    猜你喜欢
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 2011-12-24
    • 2022-01-23
    相关资源
    最近更新 更多