Здравствуйте, Doc, Вы писали:
Doc>[/ccode] Doc>не подходит, т.к. получается лишний вызов. А есть ли варнты без него?
Во-первых, насчет "лишнего вызова": современные оптимизирующие компиляторы вполне способны заинлайнить этот самый вызов.
Во-вторых, что мешает написать generic-функцию fx, используя только TCHAR:
TCHAR * fx (TCHAR *pszParam)
?
Причем не важно — обычная это функция, или член класса.
Не то.
Как я написал функции
CHAR * fxA (CHAR *pszParam);
WCHAR * fxW (WCHAR *pszParam);
уже есть. Необходимо сделать функцию которая бы вызывала нужную в зависимости от того включен ли уникод
Т.е. что бы можно было вызвать
fxA — при любой установки вызывается ansi версия
fxW — при любой установке вызывается unicode версия
fx — вызов нужной функции в зависимости от того включен ли уникод
Здравствуйте, Bell, Вы писали:
B>Во-вторых, что мешает написать generic-функцию fx, используя только TCHAR:
У меня и так A и W версия различаются только одной строкой.
И теперь еще плодить 3-ий вариант функции в внутренним #ifdef?
Тот вариант как сделаны функции WinAPI мне кажется красивее.
Здравствуйте, Doc, Вы писали:
Doc>Здравствуйте, Bell, Вы писали:
B>>Во-вторых, что мешает написать generic-функцию fx, используя только TCHAR:
Doc>У меня и так A и W версия различаются только одной строкой.
Что не может не натолкнуть на мысль об объединении этих функций в одну Doc>И теперь еще плодить 3-ий вариант функции в внутренним #ifdef?
Нет. Нужно просто попытаться объединить A и W версии в одну функцию, и забыть дефайны как страшный сон. Doc>Тот вариант как сделаны функции WinAPI мне кажется красивее.
Этот вариант используется из-за того, что WinAPI написан на С, и нельзя воспользоваться средствами С++ (перегрузка, шаблоны и т.д.).
Здравствуйте, Bell, Вы писали:
Doc>>У меня и так A и W версия различаются только одной строкой. B>Что не может не натолкнуть на мысль об объединении этих функций в одну
Придумал Теперь одна функция может ловить любой формат, включая TCHAR.
Хотя опять мне не нравится лишний... switch () ... вредный я под вечер.
Здравствуйте, Doc, Вы писали:
Doc>Хотя опять мне не нравится лишний... switch () ... вредный я под вечер.
Да, switch это не есть хорошо
Показывай свою функцию, попробуем избавиться от него.
Здравствуйте, Bell, Вы писали:
B>Да, switch это не есть хорошо B>Показывай свою функцию, попробуем избавиться от него.
Да что тут сделаешь
Добавил в класс m_nStringType, которая указывает какой тип строк использовать
USE_ANSI == 1 => CHAR
USE_UNICODE == 2 => WCHAR
USE_AUTO == 3 => определяется на этапе компиляции в зависимости от _UNICODE
Здравствуйте, Doc, Вы писали:
Doc>Здравствуйте, Bell, Вы писали:
B>>Да, switch это не есть хорошо B>>Показывай свою функцию, попробуем избавиться от него.
Doc>Да что тут сделаешь
Тип ведь известен на этапе компиляции. Пишем пару оберток:
template<typename T>
const T * wrap_sqlite3_column_text(void *pStm, int nCol);
template<>
const wchar_t * wrap_sqlite3_column_text<wchar_t>(void *pStm, int nCol)
{
return sqlite3_column_text16(pStm, nCol);
}
template<>
const char * wrap_sqlite3_column_text<char>(void *pStm, int nCol)
{
return sqlite3_column_text(pStm, nCol);
}
const TCHAR * wrap_sqlite3_column_text(void *pStm, int nCol)
{
return wrap_sqlite3_column_text<TCHAR>(pStm, nCol);
}