Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Вариация методов


Автор: Nikys 5.1.2014, 22:04
Подскажите, пожалуйста, наиболее удобную схему для вариации методов. Грубо говоря, есть реализация умножения чисел различными методами. Каким образом хранить возможность изменения метода умножения?
На данный момент есть две идеи:
1) Хранение в классе методов в виде функций, на один из которых будет ссылаться указатель на функцию.
2) Хранение в классе объекта абстрактного класса, наследники которого конкретно реализовывают задачу, и к которым динамически приводится тип объекта абстрактного класса (и из него используются возможности этих наследников).

Но хотелось бы услышать более рациональные и грамотные идеи по этому поводу для начинающего. Заранее всем благодарен.

Автор: tzirechnoy 5.1.2014, 22:44
В первую очередь, проанализируйте, когда вам потребуется изменять этот метод умножэния. Если при компиляцыи программы -- то это одно, если при создании объектов/матриц, которые будут умножаться -- то это другое, если при каждом умножэнии,  в зависимости от алгоритма -- третье, если при каждом умножэнии, в зависимости от какой-то настройки глобальной -- четвёртое.
 От этого зависит список доступных методов полиморфизма: абстрагирование при компиляцыи (шаблоны, препроцэссор), абстрагирование через конкретный тип или переменную класса, который содержыт данные, абстрагирование чере конкретный тип или переменную класса, который содержыт конкретные математические формулы, и т.п.

Автор: akizelokro 7.1.2014, 20:07
Герб Саттер. Новые сложные задачи для С++.
Hurb Sutter. Exceptional C++ (или More Exceptioanl C++)

глава "Почему невозможна частичная перегрузка шаблонов функций". Лучше не напишешь и не объяснишь, после этого можешь рассуждать (там чёткая база)

Автор: Lukkoye 7.1.2014, 23:29
Цитата(Nikys @  5.1.2014,  22:04 Найти цитируемый пост)
Подскажите, пожалуйста, наиболее удобную схему для вариации методов. Грубо говоря, есть реализация умножения чисел различными методами. Каким образом хранить возможность изменения метода умножения?


Вообще то это зависит от конкретной задачи.
Ваш запрос какой то слишком уж не конкретный.

Я приведу пример, как можно на лету менять логику обработок чего-либо:

http://rextester.com/TYPUJ89816

Код

//Title of this code
#include <stdexcept>
#include <functional>
#include <iostream>
using namespace std;


struct Processor
{
    //делегат может нацелится на любую функцию или функтор
    //который возвращает тип int, а в качестве аргументов принимает два const int
    typedef function<int(const int,const int)> Handler;
    
    Handler handler;
    
    Processor()
        :a(10)
        ,b(10)
    {}
    
    int Work()const
    {
        if(!handler)
            throw std::logic_error("invalid handle");

                //запуск удаленной функции        
        return handler(a,b);  
    }
private:
    
    int a,b;
};

int Add(const int v1, const int v2){ return v1+v2; }


struct Tester
{
    int Subtract(const int v1, const int v2)const{ return v1-v2; }
};

struct Functor
{
    int operator()(const int v1, const int v2)const{ return v1-v2; }
};


int main()
{
    cout << "Hello, world!\n";
    
    Processor proc;
    
    //назначаем в качестве обработчика простую функцию
    proc.handler = &Add;
    cout << "operation add: "<<proc.Work()<<'\n';
    
    //назначаем в качестве обработчика функтор
    proc.handler = Functor();
    cout << "operation subtract: "<<proc.Work()<<'\n';
    
    //назначаем в качестве обработчика метод класса
    Tester tester;
    proc.handler = bind(&Tester::Subtract, &tester, std::placeholders::_1,std::placeholders::_2);
    cout << "operation subtract: "<<proc.Work()<<'\n';
    
    //назначаем в качестве обработчика лямбду
    proc.handler = [](const int v1, const int v2){ return v1*v2; };
    cout << "operation multiply: "<<proc.Work()<<'\n';
}



Применяя данный способ, вы сможете на лету (в момент выполнения программы) изменять способ умножения.
Для этого вам понадобится написать несколько функций, каждая реализует какой то один способ.

И в нужный момент назначать ту, или иную функцию механизму, который с их помощью будет выполнять умножение.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)