gpt4 book ai didi

C++ - 类方法函数指针的 unordered_map 的初始化列表

转载 作者:行者123 更新时间:2023-11-28 05:02:04 25 4
gpt4 key购买 nike

我是 C++11 的新手,所以我一直在试验 std::function今天,我正在尝试使用它为字符串创建一个哈希表,以便为我正在创建的一个小型汇编器类函数指针:

汇编.cpp

#include <iostream>
#include <unordered_map>
#include <functional>
#include <vector>
#include <string>

class Assembler {

public:

// Assembles the source file and writes it
bool assemble(std::string output_file);

// Creates the symbol table from a (.s) file
bool create_symbol_table(std::string file_name);

private:

// Hash table for opcode to functions
std::unordered_map<std::string,std::function<bool(std::vector<std::string>)>>
opcode_map =
{
{"add",assemble_data_processing}
};

bool assemble_data_processing(std::vector<std::string> instruction);

};

bool Assembler::assemble_data_processing(std::vector<std::string> instruction) {
std::cout << "Data Processing" << std::endl;
return false;
}

这给了我 g++ 的编译时错误:

g++ -Wall -g -Werror -std=c++11 -o assemble.o assemble.cpp

assemble.cpp:28:5: error: could not convert ‘{{"add", ((Assembler*)this)->Assembler::assemble_data_processing}}’ from ‘<brace-enclosed initializer list>’ to ‘std::unordered_map<std::__cxx11::basic_string<char>, std::function<bool(std::vector<std::__cxx11::basic_string<char> >)> >’
};
^

但是,如果将函数设为非类函数,那么它可以毫无问题地编译:

bool assemble_data_processing(std::vector<std::string> instruction) {
std::cout << "Data Processing" << std::endl;
return false;
}

如何初始化 unordered_map在类方法的大括号初始化列表中?

最佳答案

您可以使用std::bind

std::unordered_map<std::string,std::function<bool(std::vector<std::string>)>> 
opcode_map =
{
{"add", std::bind(&Assembler::assemble_data_processing, this, std::placeholders::_1}
};

或者一个 lambda

std::unordered_map<std::string,std::function<bool(std::vector<std::string>)>> 
opcode_map =
{
{"add", [this](std::vector<std::string> instruction){return assemble_data_processing(instruction);}}
};

或者让你的函数静态化。

关于C++ - 类方法函数指针的 unordered_map 的初始化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45663678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com