LINUX.ORG.RU

C++ Собственная функция для каждого экземпляра класса

 


0

1

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

Как я понимаю, стандартным методом является указатели на функции, описанную где-то ещё, и специфичные для членов класса, передающиеся через конструктор/сеттер и т.д.

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

★★

Ну во-первых, классическое ООП - параметеризовать экземпляр класса реализацией интерфейса вида

struct Producer
{
   virtual ~Producer();
   virtual double operator()() const = 0;
};

Ну и собственно std::function как уже сказали, это современный С++, для совсем старого - boost::function.

Begemoth ★★★★★ ()
Последнее исправление: Begemoth (всего исправлений: 1)

В дополнение к вышесказанному, лямбды в С++11 тоже придумали, т.е. в экземпляре хранишь std::function, в конструктор (или в какой-нибудь set_handler()) передаешь лямбду, которую сохраняешь в этом function и все красиво работает.

roof ★★ ()
Ответ на: комментарий от anonymous

В одну std::function нельзя. Но можно, во-первых захватывать в лямду разные штуки, во-вторых передавать через std::variant кортежи со всем, что там нужно. Ну и, как-то вы же планируете узнавать, как эту функцию вызывать? От этого и плясать.

roof ★★ ()

Что значит специфичная для экземпляра? Если она хотя бы для данного класса не способна вычислять что-то, то тогда ей наверное вообще не место в классе.

Либо ты не совсем ясно изложил.

Или у тебя что-то у тебя с концепцией дизайна не то.

invy ★★★★★ ()
Последнее исправление: invy (всего исправлений: 1)

функция, специфичная для экземпляра класса

Как я понимаю, стандартным методом является указатели на функции

Для этого нет стандартных методов ибо ты хочешь что-то странное.

ya-betmen ★★★★★ ()

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

RiseOfDeath ★★★★ ()

Спасибо всем.

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

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

octy ★★ ()
Ответ на: комментарий от anonymous

ему лучше на интерпретируемом чём-то делать чтобы указывать формулы для каждой ячейки, а затем эти формулы интерпретировать аля эксель для бедных. если по хардкору, то наверное луа + биндинги к таблице наверное лучше всего зайдёт. а так любая база данных с хранимками, ну или просто view сделать и в нём описать все трансформации.

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

anonymous ()
Ответ на: комментарий от octy

Но компонентов есть всего несколько типов, дальнейшие различия в их параметрах. Потому strategy pattern, как сказали навернре подойдёт.

invy ★★★★★ ()
Последнее исправление: invy (всего исправлений: 1)

Подвожу итог. Поскольку формула для каждого экземпляра всё-таки своя, но представляет элементарную математику, то было сделано через QScriptEngine. Это, ко всему прочему, позволило легко сериализовать объекты и хранить описания компонентов в Json / текстовом виде. Как причешу чуть код, возможно, запощу ссылку на гитлаб.

octy ★★ ()