Передача функции, как аргумент

159
06 августа 2021, 02:50

ExpressionController.h:

#pragma once
#include <vector>
#include <string>
#include "Value.h"
class ExpressionController {
private:
    std::vector<Value(*)(std::vector<std::string>)> functions;
    void registerFunction(Value(*f)(std::vector<std::string>));
    Value intEval(std::vector<std::string>);
    Value doubleEval(std::vector<std::string>);
    Value stringEval(std::vector<std::string>);
public:
    Value run(int, std::vector<std::string>);
    void init();
};

ExpressionController.cpp:

#include "ExpressionController.h"
Value ExpressionController::intEval(std::vector<std::string> params) {
    return Value(params[0], 0);
}
Value ExpressionController::doubleEval(std::vector<std::string> params) {
    return Value(params[0], 1);
}
Value ExpressionController::stringEval(std::vector<std::string> params) {
    return Value(params[0], 2);
}
void ExpressionController::registerFunction(Value(*f)(std::vector<std::string>)) {
    functions.push_back(f);
}
Value ExpressionController::run(int number, std::vector<std::string> args) {
    return functions[number](args);
}
void ExpressionController::init() {
    //registerFunction(intEval);
    //registerFunction(doubleEval);
    //registerFunction(stringEval);
}

При вызове трех последних закоментированных функций, появляется такая ошибка:

Аргумент типа Value(ExpressionController::*)(std::vector<std::string, std::allocator<std::string>> params) 
не совместим с параметром типа Value(*)(std::vector<std::string, std::allocator<std::string>>)

В чем ошибка? Заранее спасибо

Answer 1

Проблема решена посредством вынесения данных трех методов, за пределы класса. Может быть кому-нибудь будет полезно:

ExpressionController.h:


#include <vector>
#include <string>
#include "Value.h"
class ExpressionController {
private:
    std::vector<Value(*)(std::vector<std::string>)> functions;
    void registerFunction(Value(*f)(std::vector<std::string>));
public:
    Value run(int, std::vector<std::string>);
    void init();
};

ExpressionController.cpp:

#include "ExpressionController.h"
Value intEval(std::vector<std::string> params) {
    return Value(params[0], 0);
}
Value doubleEval(std::vector<std::string> params) {
    return Value(params[0], 1);
}
Value stringEval(std::vector<std::string> params) {
    return Value(params[0], 2);
}
void ExpressionController::registerFunction(Value(*f)(std::vector<std::string>)) {
    functions.push_back(f);
}
Value ExpressionController::run(int number, std::vector<std::string> args) {
    return functions[number](args);
}
void ExpressionController::init() {
    registerFunction(intEval);
    registerFunction(doubleEval);
    registerFunction(stringEval);
}
READ ALSO
Ошибка инициализации в конструкторе C26495

Ошибка инициализации в конструкторе C26495

Пишет Предупреждение C26495 Variable 'Mat::temp' is uninitializedAlways initialize a member variable (type

431
C++ Поля переменной длины в структурах

C++ Поля переменной длины в структурах

Есть, например, такая структура:

112
Квадратные скобки в HTML

Квадратные скобки в HTML

Столкнулся с такой ситуациейПишу на Блогере статью

312
Как реализовать вывод видеофайла с сервера на сайт в Flask?

Как реализовать вывод видеофайла с сервера на сайт в Flask?

Имеется сервер и видео на немБэкенд представлен библиотекой Flask на Python

224