Created
October 7, 2025 07:53
-
-
Save Intey/97b3908782372ebd4eacdc710eee57a4 to your computer and use it in GitHub Desktop.
C++ dependant template type.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <cstdint> | |
| #include <string> | |
| #include <iostream> | |
| struct HWSerialParams | |
| { | |
| int RXpin; | |
| int TXpin; | |
| unsigned int baudrate; | |
| }; | |
| struct OSSerialParams | |
| { | |
| std::string path; | |
| unsigned int baudrate; | |
| }; | |
| class HardwareSerialProvider | |
| { | |
| public: | |
| using Params = HWSerialParams; | |
| HardwareSerialProvider(); | |
| HardwareSerialProvider(Params params); | |
| ~HardwareSerialProvider(); | |
| static bool isPortExist(Params params); | |
| bool open(Params params); | |
| bool isOpen() const; | |
| }; | |
| class WindowsSerialProvider | |
| { | |
| public: | |
| using Params = OSSerialParams; | |
| WindowsSerialProvider(); | |
| WindowsSerialProvider(Params params); | |
| ~WindowsSerialProvider(); | |
| static bool isPortExist(Params params); | |
| bool open(Params params); | |
| bool isOpen() const; | |
| }; | |
| template<typename ISerialProvider> | |
| class Qwerty | |
| { | |
| public: | |
| Qwerty(typename ISerialProvider::Params params) : serial(params) | |
| { | |
| std::cout << "Qwerty():" << std::endl; | |
| } | |
| ~Qwerty() | |
| { | |
| std::cout << "~Qwerty():" << std::endl; | |
| } | |
| void test(typename ISerialProvider::Params params) | |
| { | |
| std::cout << "Qwerty::test(ISerialParams)" << std::endl; | |
| if (ISerialProvider::isPortExist(params)) | |
| std::cout << "Port exists" << std::endl; | |
| else | |
| std::cout << "Port does not exist" << std::endl; | |
| serial.open(params); | |
| if (serial.isOpen()) | |
| std::cout << "Serial is open" << std::endl; | |
| else | |
| std::cout << "Serial is not open" << std::endl; | |
| } | |
| ISerialProvider serial; | |
| }; | |
| int main() | |
| { | |
| std::cout << "Qwerty<WindowsSerialProvider, OSSerialParams>:" << std::endl; | |
| Qwerty<WindowsSerialProvider> qwerty({ .path = "COM10", .baudrate = 115200 }); | |
| qwerty.test({ .path = "COM1", .baudrate = 921600 }); | |
| std::cout << "----------------------------------------" << std::endl; | |
| std::cout << std::endl; | |
| std::cout << "Qwerty<HardwareSerialProvider, HWSerialParams>:" << std::endl; | |
| Qwerty<HardwareSerialProvider> qwerty2({ .RXpin = 16, .TXpin = 17, .baudrate = 115200 }); | |
| qwerty2.test({ .RXpin = 4, .TXpin = 5, .baudrate = 921600 }); | |
| } | |
| /////////////////////////////////////////// | |
| HardwareSerialProvider::HardwareSerialProvider() | |
| { | |
| std::cout << "HardwareSerialProvider():" << std::endl; | |
| } | |
| HardwareSerialProvider::HardwareSerialProvider(HWSerialParams params) | |
| { | |
| std::cout << "HardwareSerialProvider(HWSerialParams):" << params.RXpin << ", " << params.TXpin << ", " << params.baudrate << std::endl; | |
| this->open(params); | |
| } | |
| HardwareSerialProvider::~HardwareSerialProvider() | |
| { | |
| std::cout << "~HardwareSerialProvider()" << std::endl; | |
| } | |
| bool HardwareSerialProvider::isPortExist(HWSerialParams params) | |
| { | |
| std::cout << "HardwareSerialProvider::isPortExists(HWSerialParams):" << params.RXpin << ", " << params.TXpin << ", " << params.baudrate << std::endl; | |
| return true; | |
| } | |
| bool HardwareSerialProvider::open(HWSerialParams params) | |
| { | |
| std::cout << "HardwareSerialProvider::open(HWSerialParams):" << params.RXpin << ", " << params.TXpin << ", " << params.baudrate << std::endl; | |
| return true; | |
| } | |
| bool HardwareSerialProvider::isOpen() const | |
| { | |
| std::cout << "HardwareSerialProvider::isOpen()" << std::endl; | |
| return true; | |
| } | |
| WindowsSerialProvider::WindowsSerialProvider() | |
| { | |
| std::cout << "WindowsSerialProvider():" << std::endl; | |
| } | |
| WindowsSerialProvider::WindowsSerialProvider(OSSerialParams params) | |
| { | |
| std::cout << "WindowsSerialProvider(OSSerialParams):" << params.path << ", " << params.baudrate << std::endl; | |
| this->open(params); | |
| } | |
| WindowsSerialProvider::~WindowsSerialProvider() | |
| { | |
| std::cout << "~WindowsSerialProvider()" << std::endl; | |
| } | |
| bool WindowsSerialProvider::isPortExist(OSSerialParams params) | |
| { | |
| std::cout << "WindowsSerialProvider::isPortExists(OSSerialParams):" << params.path << ", " << params.baudrate << std::endl; | |
| return true; | |
| } | |
| bool WindowsSerialProvider::open(OSSerialParams params) | |
| { | |
| std::cout << "WindowsSerialProvider::open(OSSerialParams):" << params.path << ", " << params.baudrate << std::endl; | |
| return true; | |
| } | |
| bool WindowsSerialProvider::isOpen() const | |
| { | |
| std::cout << "WindowsSerialProvider::isOpen()" << std::endl; | |
| return true; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment