170 похожих чатов

Вопрос, наверное, новичковый и впрямь. В проекте предполагается шаблонный класс, его

экземпляров будет достаточно много. Ситуация в том, что некоторые куски программы могут не знать (да и не должны), какой там у объекта класса, к которому обращаются, typename T - им лишь нужно обменяться данными с ним. Соответственно, нужно реализовать интерфейс, независящий от typename.
Может кто-нибудь подсказать, как это реализовать? Было бы хорошо на C++11, т.к. все это добро планируется под embedded-платформами юзать.

11 ответов

22 просмотра

1) возможно вам нужно наследование обычное 2) похоже на type erasure в сочетании с общениями по ивентам

Это пахнет какой-то сильнол кривой архитектурой или попыткой сделать архитектуру вселенной.

Стикер

1) Выделить и определить интерфейс для обмена данными 2) Написать шаблонный класс, наследуясь от интерфейса обмена данными 3) инстанциировать шаблонный класс с нужными параметрами

Можно использовать в качестве преобразователя информации не метод класса, std::function, в который ты можешь положить любую функцию (в том числе шаблонную), главное, чтоб был всегда одинаковый тип на входе и на выходе. Например, в твоем классе кофемашина требуется класс измельчитель зерен он принимает зерна и отдает порошок. Ты в кофемашине просто держишь std::function<порошок(зерна)> , в него же кладешь функцию (можно и шаблонную), которая принимает зерна, внутри себя она отдает зерна измельчителю кофе (тип измельчителя ты можешь передать в тело функции через шаблон). А кофемашина будет просто вызывать эту функцию, отдавая ей зерна и принимая порошок. Ей будет до лампочки какой там по факту измельчитель используется.

#include <functional> #include <iostream> #include <string> // классный измельчитель зерен struct fine_grinder { void run(std::string zerna) { std::cout << "fine frinder works with " << zerna << std::endl; } }; // хреновый измельчитель зерен struct bad_grinder { void run(std::string zerna) { std::cout << "bad frinder works with " << zerna << std::endl; } }; // инструкция по измельчению, "возмите вот этот измельчитель..." template <class Grinder_type> void grinder_func(std::string zerna) { Grinder_type grinder; grinder.run(zerna); } struct Cofemachine { void grind_coffee(std::string zerna) { grinder_(zerna); } void set_grinder(std::reference_wrapper<void(std::string)> grinder) { grinder_ = grinder; } // тут наполняем функцию переработки зерен требуемым механизмом измельчения std::reference_wrapper<void(std::string)> grinder_ = grinder_func<bad_grinder>; }; int main() { Cofemachine mycoffemaker; mycoffemaker.grind_coffee(std::string{"zerna kofe"}); mycoffemaker.set_grinder(grinder_func<fine_grinder>); mycoffemaker.grind_coffee(std::string{"zerna kofe"}); return EXIT_SUCCESS; }

Daedalus-Сердитенко Автор вопроса
The Pressbraker
#include <functional> #include <iostream> #includ...

Кажется, то, что нужно. Только надо убедиться, что на embedded-платформах будет эффективно работать.

Daedalus Сердитенко
Кажется, то, что нужно. Только надо убедиться, что...

А вот в этом тебя может ждать облом и не везде будет возмоно и придется к С путям вернуться.

Daedalus-Сердитенко Автор вопроса
Viktor Chyzhdzenka
А вот в этом тебя может ждать облом и не везде буд...

Что, до сих пор? Даже C++11 не алё на каких-нить китайских RISC-V?

Daedalus Сердитенко
Что, до сих пор? Даже C++11 не алё на каких-нить к...

Ты бы не мешал котлеты с мухами. Писать большую простыню не лень.

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта