define и методы класса
От: Doc Россия http://andrey.moveax.ru
Дата: 23.11.05 08:20
Оценка:
Для обычной функции можно написать следующее
CHAR * fxA (CHAR *pszParam);
WCHAR * fxW (WCHAR *pszParam);

#ifdef _UNICODE 
 #define fx fxW
#else
 #define fx fxA
#endif

При вызове fx будет непосредственно подставляться нужная функция (в зависимости от _UNICODE).

А как подобное сделать для класса?
class A
{
 public:
  CHAR * fxA (CHAR *pszParam);
  WCHAR * fxW (WCHAR *pszParam);
}

Вариант
TCHAR * A::fx (TCHAR *pszParam)
{ 
#ifdef _UNICODE 
 return fxW (pszParam);
#else
 return fxA (pszParam);
#endif
}

не подходит, т.к. получается лишний вызов. А есть ли варнты без него?
Re: define и методы класса
От: Greg Zubankov СССР  
Дата: 23.11.05 08:24
Оценка:
Здравствуйте, Doc, Вы писали:

class A
{
 public:
#ifdef _UNICODE 
  CHAR * fx (CHAR *pszParam);
#else
  WCHAR * fx (WCHAR *pszParam);
#endif
}


?
Re: define и методы класса
От: Ovl Россия  
Дата: 23.11.05 08:27
Оценка: 2 (1) +2
Здравствуйте, Doc, Вы писали:

Doc>Для обычной функции можно написать следующее

Doc>
Doc>CHAR * fxA (CHAR *pszParam);
Doc>WCHAR * fxW (WCHAR *pszParam);

Doc>#ifdef _UNICODE 
Doc> #define fx fxW
Doc>#else
Doc> #define fx fxA
Doc>#endif
Doc>

Doc>При вызове fx будет непосредственно подставляться нужная функция (в зависимости от _UNICODE).

Doc>А как подобное сделать для класса?



class A
{
 public:
  CHAR  * fx (CHAR *pszParam);
  WCHAR * fx (WCHAR *pszParam);
}


оставить так. для этого перегрузка функции и делается. если нужно — из fx c char-ом вызвать fx(WCHAR)
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re: define и методы класса
От: Bell Россия  
Дата: 23.11.05 08:27
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>[/ccode]

Doc>не подходит, т.к. получается лишний вызов. А есть ли варнты без него?
Во-первых, насчет "лишнего вызова": современные оптимизирующие компиляторы вполне способны заинлайнить этот самый вызов.
Во-вторых, что мешает написать generic-функцию fx, используя только TCHAR:
TCHAR * fx (TCHAR *pszParam)

?
Причем не важно — обычная это функция, или член класса.
Любите книгу — источник знаний (с) М.Горький
Re[2]: define и методы класса
От: Doc Россия http://andrey.moveax.ru
Дата: 23.11.05 09:04
Оценка:
Здравствуйте, Greg Zubankov, Вы писали:

Не то.
Как я написал функции
CHAR * fxA (CHAR *pszParam);
WCHAR * fxW (WCHAR *pszParam);

уже есть. Необходимо сделать функцию которая бы вызывала нужную в зависимости от того включен ли уникод
Т.е. что бы можно было вызвать
fxA — при любой установки вызывается ansi версия
fxW — при любой установке вызывается unicode версия
fx — вызов нужной функции в зависимости от того включен ли уникод
Re[2]: define и методы класса
От: Doc Россия http://andrey.moveax.ru
Дата: 23.11.05 09:06
Оценка:
Ovl>оставить так. для этого перегрузка функции и делается. если нужно — из fx c char-ом вызвать fx(WCHAR)
А ведь вариант.
Re[2]: define и методы класса
От: Doc Россия http://andrey.moveax.ru
Дата: 23.11.05 09:07
Оценка:
Здравствуйте, Bell, Вы писали:

B>Во-вторых, что мешает написать generic-функцию fx, используя только TCHAR:


У меня и так A и W версия различаются только одной строкой.
И теперь еще плодить 3-ий вариант функции в внутренним #ifdef?
Тот вариант как сделаны функции WinAPI мне кажется красивее.
Re[3]: define и методы класса
От: Bell Россия  
Дата: 23.11.05 09:14
Оценка: 2 (1) +2
Здравствуйте, Doc, Вы писали:

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


B>>Во-вторых, что мешает написать generic-функцию fx, используя только TCHAR:


Doc>У меня и так A и W версия различаются только одной строкой.

Что не может не натолкнуть на мысль об объединении этих функций в одну
Doc>И теперь еще плодить 3-ий вариант функции в внутренним #ifdef?
Нет. Нужно просто попытаться объединить A и W версии в одну функцию, и забыть дефайны как страшный сон.
Doc>Тот вариант как сделаны функции WinAPI мне кажется красивее.
Этот вариант используется из-за того, что WinAPI написан на С, и нельзя воспользоваться средствами С++ (перегрузка, шаблоны и т.д.).
Любите книгу — источник знаний (с) М.Горький
Re[4]: define и методы класса
От: Doc Россия http://andrey.moveax.ru
Дата: 23.11.05 09:54
Оценка:
Здравствуйте, Bell, Вы писали:

Doc>>У меня и так A и W версия различаются только одной строкой.

B>Что не может не натолкнуть на мысль об объединении этих функций в одну

Придумал Теперь одна функция может ловить любой формат, включая TCHAR.

Хотя опять мне не нравится лишний... switch () ... вредный я под вечер.
Re[5]: define и методы класса
От: Bell Россия  
Дата: 23.11.05 10:01
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>Хотя опять мне не нравится лишний... switch () ... вредный я под вечер.

Да, switch это не есть хорошо
Показывай свою функцию, попробуем избавиться от него.
Любите книгу — источник знаний (с) М.Горький
Re[6]: define и методы класса
От: Doc Россия http://andrey.moveax.ru
Дата: 23.11.05 12:00
Оценка:
Здравствуйте, Bell, Вы писали:

B>Да, switch это не есть хорошо

B>Показывай свою функцию, попробуем избавиться от него.

Да что тут сделаешь
Добавил в класс m_nStringType, которая указывает какой тип строк использовать
USE_ANSI == 1 => CHAR
USE_UNICODE == 2 => WCHAR
USE_AUTO == 3 => определяется на этапе компиляции в зависимости от _UNICODE

Получается вот так (одна из функций):

const void * GetString (int nCol, int nStrType = 0)
{
 // тут разный код....

 if (nStrType == 0) nStrType = m_nStringType;

 switch (nStrType) {
   case USE_ANSI:    return (void *)sqlite3_column_text (pStm, nCol); // возвращаем CHAR
   case USE_UNICODE: return (void *)sqlite3_column_text16 (pStm, nCol); // возвращаем WCHAR
 }

// Возвращает TCHAR
#ifdef _UNICODE
    return (void *)sqlite3_column_text16 (pStm, nCol);
#else
    return (void *)sqlite3_column_text (pStm, nCol);
#endif
 }
}


В общем все остальные функции, которые работают со строками думаю так же сделать.
Re[7]: define и методы класса
От: Angler Россия  
Дата: 24.11.05 14:50
Оценка:
Здравствуйте, 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);
}



используем:

const TCHAR * dummy = wrap_sqlite3_column_text(0, 0);
const char * dummy2 = wrap_sqlite3_column_text<char>(0, 0);
const wchar_t *dummy3 = wrap_sqlite3_column_text<wchar_t>(0, 0);
Re: define и методы класса
От: IROV..  
Дата: 25.11.05 11:37
Оценка: +1
Здравствуйте, Doc, Вы писали:

Doc>Для обычной функции можно написать следующее

Doc>
Doc>CHAR * fxA (CHAR *pszParam);
Doc>WCHAR * fxW (WCHAR *pszParam);

Doc>#ifdef _UNICODE 
Doc> #define fx fxW
Doc>#else
Doc> #define fx fxA
Doc>#endif
Doc>

Doc>При вызове fx будет непосредственно подставляться нужная функция (в зависимости от _UNICODE).

Doc>А как подобное сделать для класса?

Doc>
Doc>class A
Doc>{
Doc> public:
Doc>  CHAR * fxA (CHAR *pszParam);
Doc>  WCHAR * fxW (WCHAR *pszParam);
Doc>}
Doc>

Doc>Вариант
Doc>
Doc>TCHAR * A::fx (TCHAR *pszParam)
Doc>{ 
Doc>#ifdef _UNICODE 
Doc> return fxW (pszParam);
Doc>#else
Doc> return fxA (pszParam);
Doc>#endif
Doc>}
Doc>

Doc>не подходит, т.к. получается лишний вызов. А есть ли варнты без него?



class D
{
public:
    int fxW()
    {
        return a;
    }

    float fxA()
    {
        return float(a);
    }
private:
    int a;
};

#ifdef _UNICODE 
#define fx fxW
#else
#define fx fxA
#endif

void main()
{
    D d;
    printf("%d",d.fx());
}
я не волшебник, я только учусь!
Re: define и методы класса
От: _nn_ www.nemerleweb.com
Дата: 25.11.05 11:40
Оценка:
Здравствуйте, Doc, Вы писали:

Полагаю это
Автор: folk
Дата: 17.03.04
вам поможет.
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.