Я пытаюсь реализовать шаблонный читатель класса в g ++ --std = c ++ 17, который не тянет все различные системные заголовки для любого типа потока, который я читаю.
Я могу использовать шаблон pimpl, чтобы отделить параметры шаблона от базовой реализации, но я чувствую, что мне следует этого избежать, указав, что определение модуля компиляции для этой функции не изменится в зависимости от параметра шаблона.
Я также могу использовать явную специализацию, но определение каждой специализации слишком обременительно.
В шапке:
template<typename Parser>
class FileStream
{
Parser& parser;
int fd;
FileStream::FileStream(const char* filename, Parser& parser)
: parser(parser)
{
init(filename);
}
void init(const char* filename); // Preferably, implementation would go into .cpp file since this function does not use any template parameters
void step(char* buf, size_t len)
{
// This function needs to be in the header because it uses parser
parser.processMessage(buf, len);
}
};
В файле .cpp:
// Let's try to not include these headers in the template definition header
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
template< /* ??? */ >
void FileStream::init(const char* filename)
{
// Note: No template parameters are used in this function
fd = open(filename, O_RDONLY);
}