Одна функция для разных типов
От: Su34 Россия  
Дата: 25.08.25 15:40
Оценка:
Две функции выполняют одно и тоже, различаются по типам.
void search(const char* mask)
{
    _finddata_t fd;
    _findfirst(mask, &fd);
}
void wsearch(const wchar_t* mask)
{
    _wfinddata_t fd;
    _wfindfirst(mask, &fd);
}

Можно ли объединить в одну функцию (или шаблон)? Хочется следующее:
asearch("*.txt");    // выполняется search 
asearch(L"*.txt");    // выполняется wsearch

Спасибо!
Re: Одна функция для разных типов
От: Pzz Россия https://github.com/alexpevzner
Дата: 25.08.25 15:47
Оценка: +2
Здравствуйте, Su34, Вы писали:

S>Две функции выполняют одно и тоже, различаются по типам.

S>
void search(const char* mask)
S>{
S>    _finddata_t fd;
S>    _findfirst(mask, &fd);
S>}
S>void wsearch(const wchar_t* mask)
S>{
S>    _wfinddata_t fd;
S>    _wfindfirst(mask, &fd);
S>}


А это реальный код, или упрощённый?

S>Можно ли объединить в одну функцию (или шаблон)? Хочется следующее:


Можно в шаблон. Но толку-то? Тела всё равно разные, придётся делать специализацию. Если бы там был изложен сложный алкогоритм, это имело бы смысл. А если две строчки, как в примере, вся эта магия вокруг шаблонов только путаницу будет вносить. Проще две строчки повторить. Да, это повторемие, но зато читать проще.
Re: Одна функция для разных типов
От: Stanislav V. Zudin Россия  
Дата: 25.08.25 15:52
Оценка:
Здравствуйте, Su34, Вы писали:

S>Две функции выполняют одно и тоже, различаются по типам.

S>
void search(const char* mask)
S>{
S>    _finddata_t fd;
S>    _findfirst(mask, &fd);
S>}
S>void wsearch(const wchar_t* mask)
S>{
S>    _wfinddata_t fd;
S>    _wfindfirst(mask, &fd);
S>}

S>Можно ли объединить в одну функцию (или шаблон)? Хочется следующее:
S>
asearch("*.txt");    // выполняется search 
S>asearch(L"*.txt");    // выполняется wsearch

S>Спасибо!

См. функции с префиксом "_t"
https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/findfirst-functions?view=msvc-170

Или обе функции нужно использовать одновременно?
Тогда вариантов нет, с шаблоном тут сэкономить не получится.
_____________________
С уважением,
Stanislav V. Zudin
Отредактировано 25.08.2025 15:54 Stanislav V. Zudin . Предыдущая версия .
Re[2]: Одна функция для разных типов
От: Su34 Россия  
Дата: 25.08.25 16:42
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Можно в шаблон. Но толку-то? Тела всё равно разные, придётся делать специализацию. Если бы там был изложен сложный алкогоритм, это имело бы смысл. А если две строчки, как в примере, вся эта магия вокруг шаблонов только путаницу будет вносить. Проще две строчки повторить. Да, это повторемие, но зато читать проще.

Скорее всего вопрос был задан достаточно некорректно.
В приложении для Windows выполняется вызов функции, напр. search(GetWindowText()). Здесь подразумевается что GetWindowText() вернет строку текста, но вернет текст типа wchar_t, если указан UNICODE, или char, если не указан при компиляции. Соответственно мне необходимо иметь 2 функции search(const char* text) и search(const wchar_t* text).
Или я туплю.
Re: Одна функция для разных типов
От: rg45 СССР  
Дата: 25.08.25 16:45
Оценка:
Здравствуйте, Su34, Вы писали:

S>Две функции выполняют одно и тоже, различаются по типам.

S>
void search(const char* mask)
S>{
S>    _finddata_t fd;
S>    _findfirst(mask, &fd);
S>}
S>void wsearch(const wchar_t* mask)
S>{
S>    _wfinddata_t fd;
S>    _wfindfirst(mask, &fd);
S>}

S>Можно ли объединить в одну функцию (или шаблон)? Хочется следующее:
S>
asearch("*.txt");    // выполняется search 
S>asearch(L"*.txt");    // выполняется wsearch

S>Спасибо!

Если я правильно понял, то главная цель — не экономия нескольких строк кода, а возможность унифицированного вызова?. Тогда можно просто написать обёртку с двумя перегрузками:

void asearch(const char* mask) { return search(mask); }
void asearch(const wchar_t* mask) { return wsearch(mask); }


Ну или просто переименовать обе исходные функции в asearch.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 25.08.2025 17:10 rg45 . Предыдущая версия . Еще …
Отредактировано 25.08.2025 16:46 rg45 . Предыдущая версия .
Re[3]: Одна функция для разных типов
От: sergii.p  
Дата: 25.08.25 20:12
Оценка: +2
Здравствуйте, Su34, Вы писали:

S>В приложении для Windows выполняется вызов функции, напр. search(GetWindowText()). Здесь подразумевается что GetWindowText() вернет строку текста, но вернет текст типа wchar_t, если указан UNICODE, или char, если не указан при компиляции. Соответственно мне необходимо иметь 2 функции search(const char* text) и search(const wchar_t* text).

S>Или я туплю.

так вроде в winapi на каждую пару функций есть специальные макросы. Для поиска файла например есть макрос FindFirstFile который перенаправляет на FindFirstFileA или FindFirstFileW соответственно. Если двигаться в канве winapi незазорно будет определить и свои макросы

#ifdef UNICODE
  #define findfirst _wfindfirst
#else
  #define findfirst _findfirst
#endif
Отредактировано 25.08.2025 20:14 sergii.p . Предыдущая версия .
Re[4]: Одна функция для разных типов
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 27.08.25 19:21
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP>так вроде в winapi на каждую пару функций есть специальные макросы. Для поиска файла например есть макрос FindFirstFile который перенаправляет на FindFirstFileA или FindFirstFileW соответственно. Если двигаться в канве winapi незазорно будет определить и свои макросы


SP>
SP>#ifdef UNICODE
SP>  #define findfirst _wfindfirst
SP>#else
SP>  #define findfirst _findfirst
SP>#endif
SP>



Только если ты в одном типе сборки работаешь с одним типом строк. Если же в одной и той же конфигурации сборки ты хочешь и string и цstring, то тогда нужны перегрузки.
С такими макросами — это плохой путь
Маньяк Робокряк колесит по городу
Re[3]: Одна функция для разных типов
От: _NN_  
Дата: 29.08.25 08:52
Оценка:
Здравствуйте, Su34, Вы писали:

S>Здравствуйте, Pzz, Вы писали:


Pzz>>Можно в шаблон. Но толку-то? Тела всё равно разные, придётся делать специализацию. Если бы там был изложен сложный алкогоритм, это имело бы смысл. А если две строчки, как в примере, вся эта магия вокруг шаблонов только путаницу будет вносить. Проще две строчки повторить. Да, это повторемие, но зато читать проще.

S>Скорее всего вопрос был задан достаточно некорректно.
S>В приложении для Windows выполняется вызов функции, напр. search(GetWindowText()). Здесь подразумевается что GetWindowText() вернет строку текста, но вернет текст типа wchar_t, если указан UNICODE, или char, если не указан при компиляции. Соответственно мне необходимо иметь 2 функции search(const char* text) и search(const wchar_t* text).
S>Или я туплю.

Вы пишете программу для Windows 9x?
Если нет, то просто всегда работаете с wchar_t , что и является сегодня по умолчанию.
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.