首页 > 解决方案 > std::function 是否有可能返回一个值?

问题描述

因此,对于我目前正在进行的一个项目,我正在尝试创建一种“函数查找表”,基本上是字符串到函数的映射。该函数接收数据,对其进行修改,然后将其吐出。但是, std::function 似乎不可能返回任何内容。

我尝试的(对 std::function 不太了解)只是简单地这样写;

map<string, function<Array(vector<pair<char, string>>)>>

或者更具体地说,

function<Array(vector<pair<char, string>>)>

(数组是我自己的类,但其他一切都在标准中)

如果我写它没有回报;

function<void(vector<pair<char, string>>)>

它工作正常。

gcc给出的错误是;

no matching constructor for initialization of 'map<std::__1::string, function<Array (vector<pair<char, std::__1::string> >)> >'

有什么方法可以使用 std::function 或任何类似方法返回一个值,还是我完全误解了这一点?

编辑:这是问题主类中涉及的代码(缩短,可能有额外的包含):

#include <iostream>
#include <map>
#include <array>
#include <fstream>
#include <algorithm>
#include <vector>
#include <functional>

#include "Array.h"

using namespace std;

int main() {
    map<string, function<Array(vector<pair<char, string>>)>> dictionary = 
    {
        { 
            "JMP", 
            [](vector<pair<char, string>> operands) {
                if (operands.size() == 1) {
                    char data[2];

                    switch (operands[0].first) {
                    case 3:
                        data[1] = static_cast<char>(bitset<8>(operands[0].second.substr(1, 2)).to_ulong());

                        break;
                    case 4:
                        data[1] = static_cast<char>(bitset<8>(operands[0].second.substr(2, 8)).to_ulong());

                        break;
            case 5:
                data[1] = static_cast<char>(bitset<8>(operands[0].second.substr(2, 8)).to_ulong());

                        break;
                        default:
                            exit(0);
                    }

                    data[0] = 0b00000001;
                    return Array(data, 2);
                } 
                else {
                    exit(2);
                }
            } 
        },
        { 
            "MOV", 
            [](vector<pair<char, string>> operands) {
                return nullptr;
            }
        }
    };

    return 0;
}

数组类头:

#ifndef ARRAY_H_
#define ARRAY_H_

struct Array {
public:
    Array();
    Array(char* data, int size);
    virtual ~Array();

    char* data;
    int size;
};

#endif /* ARRAY_H_ */

数组类来源:

#include "Array.h"

Array::Array() {
    data = nullptr;

    size = 0;
}

Array::Array(char* data, int size) {
    this -> data = data;
    this -> size = size;
}

Array::~Array() {}

标签: c++std-function

解决方案


您的问题是您的函数返回 Array 类型的对象,而不是指向它的指针。所以返回 nullptr 显然会导致编译错误。尝试返回一个空数组。

{ 
    "MOV", 
    [](vector<pair<char, string>> operands) {
        return Array();
    }
}

推荐阅读