шаблоны — статический C ++, а не динамический полиморфизм

Я пытаюсь построить общий алгоритм. До сих пор я достиг этого, используя иерархию классов и указатели, как в примере ниже:

struct Base{
virtual double fn(double x){return 0;}
};

class Derived : public  Base{
double A;
public:
Derived(double a) : A(a) {}
double fn(double x) { return A*x;}
};

//Some other implementations

class algo{
double T;
std::unique_ptr<Base> b_ptr;
public:
algo(double t, std::unique_ptr<Base>& _ptr); //move constructor...
//Some constructors
double method(double x){ return T*b_ptr->fn(x);}

};

Эта настройка затем реализуется следующим образом:

int main(){
std::unique_ptr<Derived> ptr(new Derived(5.4));
algo(3.2,ptr);
method(2.4);

return 0;
}

Конечно, это очень простой пример, но он служит для моего вопроса. Из того, что я понимаю, использование производных классов таким способом означает, что метод выбирается во время выполнения, а не во время компиляции. Поскольку мне не нужно никакого динамического поведения из моего алгоритма — все определяется во время компиляции — это ненужная потеря эффективности. Есть ли способ сделать вышеупомянутое во время компиляции, то есть статический полиморфизм?

Из того, что я понимаю, получить статический полиморфизм можно только с помощью шаблонов. Однако я не смог найти шаблоны реализации с не примитивными типами. Как и в примере выше, мне нужны производные классы с конструкторами не по умолчанию, что кажется невозможным … Может ли кто-нибудь предложить какие-либо решения относительно того, как это можно сделать?

5

Решение

Ваш Базовый класс и Derived, кажется, представляют функцию, имеющую только одну функцию-член,
так что мы, скорее всего, могли бы полностью покончить с полиморфизмом и передать функцию в алгоритм:

#include <iostream>
#include <utility>

template <class Function>
class algo
{
double t;
Function fn;

public:
algo(double t, const Function& fn)
: t{t}, fn{fn}
{ }
double method(double x){ return t * fn(x);}

};

template <class Function>
algo<Function> make_algo(double t, Function&& fn)
{
return algo<Function>(t, std::forward<Function>(fn));
}

int main()
{
const double someValue = 123;
const double anotherValue = 987;

auto algo = make_algo(anotherValue, [someValue](double otherValue) {
return someValue * otherValue;
});

std::cout << std::fixed << algo.method(321) << std::endl;
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]