C ++: передовая практика для нескольких реализаций функции класса?

Каков наилучший способ в C ++ реализовать несколько версий одной и той же функции-члена класса, не загромождая интерфейс вашего класса?

В поисках наиболее эффективного метода вычисления чего-либо я часто измеряю потребности в ресурсах (время, пространство и т. Д.) Нескольких реализаций одной и той же функции. Я должен добавить, что цель состоит в том, чтобы сохранить эти реализации даже после сравнения один оказался лучше другого. В C ++ я придумал что-то, что обеспечивает следующий интерфейс:

#include "foo.h"
int main(){
Foo foo;
foo.Print();

foo.Add();                   // adds 1
foo.Print();

foo.Implementation1::Add();  // adds 10
foo.Print();

foo.Implementation2::Add();  // adds 100
foo.Print();

return 0;
}

Полный код можно найти в Git репозиторий. Хотя мне нравится, что этот интерфейс обеспечивает четкое различие между каждой реализацией, и вы можете вызывать его для одного и того же объекта, метод, используемый для этого, не очень приятен: я получаю доступ к значениям в базовом классе из производного класса. Этот подход требует, чтобы мы сделали класс, для которого мы хотим сделать несколько реализаций, производным классом, который имеет базовый класс для каждой отдельной реализации. Кроме того, я должен дружить с базовыми классами. Я получаю мурашки по коже … нет … кошмары .. 🙂

Не загромождая класс, добавляя Add1(), Add2()и т. д. для вашего класса, для чего нужна хорошая реализация нескольких функций-членов класса?

3

Решение

Не уверен, что это именно то, что вы ищете, но вы могли бы сделать что-то вроде этого.

#include <iostream>

class Foo {
int x = 0;

public:
template <std::size_t N = 1>
void add();

void print() {
std::cout << x << std::endl;
}
};

template <>
void Foo::add<1>() {
x += 1;
}

template <>
void Foo::add<2>() {
x += 10;
}

template <>
void Foo::add<3>() {
x += 100;
}

int main() {
Foo f;
f.print();

f.add();
f.print();

f.add<2>();
f.print();

f.add<3>();
f.print();
return 0;
}

Вы можете сохранить специализации в .cpp, чтобы избежать необходимости раскрывать все реализации в вашем определении класса.

4

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector