std::function 到 return 值是否可能?
Is it possible for a std::function to return a value?
因此,对于我目前正在进行的项目,我正在尝试创建一种 "Function lookup table",基本上是字符串到函数的映射。该函数接收数据,对其进行修改,然后将其吐出。但是,std::function 到 return 似乎不可能。
我尝试的(对std::function不太了解)只是简单地写成这样;
map<string, function<Array(vector<pair<char, string>>)>>
或者更具体地说,
function<Array(vector<pair<char, string>>)>
(数组是我自己的 class,但其他一切都在 std 中)
如果我写的时候没有 return;
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 或任何类似方法 return 一个值,还是我完全误解了这个?
编辑:
这是问题中涉及的代码
Main Class(缩写,可能有额外的包含):
#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;
}
数组ClassHeader:
#ifndef ARRAY_H_
#define ARRAY_H_
struct Array {
public:
Array();
Array(char* data, int size);
virtual ~Array();
char* data;
int size;
};
#endif /* ARRAY_H_ */
数组Class 来源:
#include "Array.h"
Array::Array() {
data = nullptr;
size = 0;
}
Array::Array(char* data, int size) {
this -> data = data;
this -> size = size;
}
Array::~Array() {}
你的问题是你的函数 returns 是一个 Array 类型的对象,而不是指向它的指针。所以返回 nullptr 显然会导致编译错误。尝试返回一个空数组。
{
"MOV",
[](vector<pair<char, string>> operands) {
return Array();
}
}
因此,对于我目前正在进行的项目,我正在尝试创建一种 "Function lookup table",基本上是字符串到函数的映射。该函数接收数据,对其进行修改,然后将其吐出。但是,std::function 到 return 似乎不可能。
我尝试的(对std::function不太了解)只是简单地写成这样;
map<string, function<Array(vector<pair<char, string>>)>>
或者更具体地说,
function<Array(vector<pair<char, string>>)>
(数组是我自己的 class,但其他一切都在 std 中)
如果我写的时候没有 return;
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 或任何类似方法 return 一个值,还是我完全误解了这个?
编辑: 这是问题中涉及的代码 Main Class(缩写,可能有额外的包含):
#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;
}
数组ClassHeader:
#ifndef ARRAY_H_
#define ARRAY_H_
struct Array {
public:
Array();
Array(char* data, int size);
virtual ~Array();
char* data;
int size;
};
#endif /* ARRAY_H_ */
数组Class 来源:
#include "Array.h"
Array::Array() {
data = nullptr;
size = 0;
}
Array::Array(char* data, int size) {
this -> data = data;
this -> size = size;
}
Array::~Array() {}
你的问题是你的函数 returns 是一个 Array 类型的对象,而不是指向它的指针。所以返回 nullptr 显然会导致编译错误。尝试返回一个空数组。
{
"MOV",
[](vector<pair<char, string>> operands) {
return Array();
}
}