экземпляров будет достаточно много. Ситуация в том, что некоторые куски программы могут не знать (да и не должны), какой там у объекта класса, к которому обращаются, typename T - им лишь нужно обменяться данными с ним. Соответственно, нужно реализовать интерфейс, независящий от typename.
Может кто-нибудь подсказать, как это реализовать? Было бы хорошо на C++11, т.к. все это добро планируется под embedded-платформами юзать.
1) возможно вам нужно наследование обычное 2) похоже на type erasure в сочетании с общениями по ивентам
Это пахнет какой-то сильнол кривой архитектурой или попыткой сделать архитектуру вселенной.
Стикер
Правильно говорит. Надо пилить какой-то middle-ware.
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; }
Кажется, то, что нужно. Только надо убедиться, что на embedded-платформах будет эффективно работать.
А вот в этом тебя может ждать облом и не везде будет возмоно и придется к С путям вернуться.
Что, до сих пор? Даже C++11 не алё на каких-нить китайских RISC-V?
Ты бы не мешал котлеты с мухами. Писать большую простыню не лень.
Обсуждают сегодня