Как реализовать распознавание команд в c++?

202
26 июля 2018, 03:40

Есть команда состоящая из нескольких частей: действие -> объекты над которыми действие совершается.

Проблема заключается в том что я не могу придумать наиболее подходящий способ определения какое действие необходимо выполнить и последующего выполнения. Можно конечно сделать всё с помощью switch но хотелось бы по элегантнее.

Думал можно создать ассоциативный массив с ключом в виде string, а значением был бы указатель на функцию но ведь тогда этот указатель сможет указывать только на функции с одинаковыми параметрами и возвращаемыми значениями. Больше идей нет.

Answer 1

Использовать основные преимущества С++. Насколько я правильно понел ваши пожелания, приведу пример, который может вам помочь:

#include <iostream>
#include <vector>
#include <algorithm>
using std::string;
using std::vector;
int sum(const vector<int>& v)
{
    int k{};
    k = std::accumulate(v.begin(), v.end(), k);
    return k;
}
class Action {
public:
    virtual void do_it() = 0;
    virtual void show() = 0;
    virtual ~Action() = default;
};    
class Uppercase : public Action {
    string s;
public:
    Uppercase(const string& obj) : s(obj) {}
    // использование std::transform
    void do_it() {
        std::transform(s.begin(), s.end(), s.begin(),
                       [](char c) { return toupper(c);});
    }
    void show() { std::cout << s << std::endl; }
};
class ComputeSum : public Action {
    vector<int> v;
    int n;
public:
    ComputeSum(const vector<int>& k) : v(k), n(0) {}
    void do_it()
    {
        n = sum(v);  // использование функции int sum(const vector<int>&)
    }
    void show() {
        std::cout << "sum of numbers: ";
        for (int i : v)
            std::cout << i << ' ';
        std::cout << " = " << n << std::endl;
    }
};
// таким образом для каждой задачи вы можете написать новый производный класс   
// вот функция с рудиментарным кодом
void res(vector<Action*> v)
{
    for (auto p : v)
    {
        p->do_it();
        p->show();
    }
} 
int main()
{   
    vector<Action*> vf;
    Uppercase u("uppercase");
    ComputeSum c(vector<int>{2, 3, 5, 11});
    vf.emplace_back(&u);
    vf.emplace_back(&c);
    res(vf); // просто нужно вызвать функцию с рудиментарным кодом
    return 0;
}
READ ALSO
Как правильно перехватывать нажатия клавиш в Windows Forms (C++)?

Как правильно перехватывать нажатия клавиш в Windows Forms (C++)?

На Form есть DataGridView (в нём показывается одна строка) и WebBrowser

184
C++ ошибка dependent name is not a type, prefix with &#39;typename&#39; to indicate a type

C++ ошибка dependent name is not a type, prefix with 'typename' to indicate a type

пишу бинарное дерево и наткнулся на очень непонятную мне ошибку, вот пример:

208
Вывод кол-во раз char * какой-то int

Вывод кол-во раз char * какой-то int

Пытаюсь сделать следующие,

203
Qml fullscreen окно

Qml fullscreen окно

Необходимо отрисовать главное окно в фулскринеПодскажите как это сделать! Нагугли что можно выводить так :

198