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

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

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

11 ответов

30 просмотров

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 не алё на каких-нить к...

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта