Skip to content

Instantly share code, notes, and snippets.

@Intey
Created October 7, 2025 07:53
Show Gist options
  • Select an option

  • Save Intey/97b3908782372ebd4eacdc710eee57a4 to your computer and use it in GitHub Desktop.

Select an option

Save Intey/97b3908782372ebd4eacdc710eee57a4 to your computer and use it in GitHub Desktop.
C++ dependant template type.
#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