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

Всем привет, подскажите как можно сократить повторяющийся код. Для примера,

есть кастомная функция CreateFile , в Win API есть CreateFileA для char, CreateFileW для wchar_t . Наша же функция CreateFile должна уметь работать c char, wchar_t, std::string, std::wstring , но для реализации всех этих типов данных в функции нужно 4 версии CreateFile, ладно если бы различие в коде были бы весомым, но различие в коде достигает предела максимум в 8 символов (.c_str()), для char CreateFileA, wchar_t CreateFileW , string CreateFileA(.c_str()), wstring CreateFileW(.c_str()).
Pastebin - https://pastebin.com/LzCPq9aR . Как можно избежать подобного кода и сократить его? Я думал при помощи шаблона template<typename _In> и constexpr определять тип данных шаблонного значения. Можно убрать char, wchar и оставить только std::string, wstring , но сути дела не меняет, это тоже самое что пытаться уйти от проблем.

5 ответов

15 просмотров

А зачем использовать виндовые апи?

Ну можно специализировать шаблоны, например

ну, так можно: template<typename T> struct FileTraits; template<> struct FileTraits<char>{ static auto create(const char*n) {return CreateFileA(n);} }; template<> struct FileTraits<wchar_t>{ static auto create(const wchar_t*n) {return CreateFileW(n);} }; template<typename T> int create(const T*n) { return FileTraits<T>::create(n); } template<typename S> int create(const S&s) { return create(s.c_str()); }

перегрузки для char* не нужны, итого два варианта

Ито я бы забил хер и на wchar_t и принимал бы тупо fs::path

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
5
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Карта сайта