Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: проверка класса в макросе  (Прочитано 16154 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« : 05-06-2007 05:04 » 

как на этапе компиляции проверить, что переданный аргумент является именно экземпляром определённого класса ZZZ ?

например я подразумеваю, что передадут объект CString

Код:
#define def_xxxx(par_CString) \
  ...\
  ...

что приписать в макросе, чтобы , если передан объект не класса CString, компилятор ругался бы ?
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #1 : 05-06-2007 05:32 » 

у меня два предложения(вообще их больше)
1. создай inline функцию получающую CString, но которая ничего не делает и вызывай её в макросе
2. создай шаблонную функцию у которой в теле будет что-то на вроде BOOST_STATIC_ASSERT(true) для CString сделай специализацию с пустым телом.
Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #2 : 05-06-2007 06:41 » 

LogRus, что за BOOST_STATIC_ASSERT ?

а вот с функцией мысля )  , спасибо

Код:
//контроль типа переменной на этапе компиляции
#ifdef _DEBUG
#define def_check_type(type_name,variable) \
{\
struct s_control\
{\
s_control(type_name* pvar){pvar=0;}\
};\
\
s_control::s_control(&variable);\
}
#else
#define def_check_type(type_name,variable)

#endif


CString txt;
CString* ptxt;
int n;
char ch;
char* pch;

def_check_type(CString,txt); // только тут не ругаецо, как и нужно )
def_check_type(CString,ptxt);
def_check_type(CString,n);
def_check_type(CString,ch);
def_check_type(CString,pch);

Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #3 : 05-06-2007 10:24 » 

BOOST_STATIC_ASSERT генерирует ошибку на этапе компиляции если аргумент = true

вот такой код
template<class T1, class T2>
check_same(T2)
{
    BOOST_STATIC_ASSERT((boost::is_same<T1,T2>::value));
}

далее вместо
def_check_type(CString,pch);
пишем
check_same<CString>(pch);

вот и всё так можно проверить что правильно передан параметр
естественно эта функция не очень полезна вне шаблов, потому как вне шаблонов мы обычно и так знаем типы переменных внутри функций.
Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #4 : 05-06-2007 10:32 » 

чёта мне как-то макросы ближе и роднее )

а BOOST_STATIC_ASSERT всё равно не нашёл...
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #5 : 05-06-2007 12:59 » 

Алексей1153++, www.boost.org, а макросы это зло Улыбаюсь не гоже програмисту на c++ использовать макросы если конечно это не исключительный случай

можно без буста сделать
template<int n> struct compile_error
{
   int i[n];
}

template<class T>
check_CStringType(T)
{
   compile_error<0> c;
}

template<> check_CStringType<CString>(CString){}
Записан

Странно всё это....
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 05-06-2007 13:15 » 

Алексей, а какой смысл тогда создавать макрос, если можно просто вызывать функцию? Тем более, что ты это и делаешь в самом макросе
Записан

ещё один вопрос ...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #7 : 05-06-2007 13:26 » 

nikedeforest, всё нормально. Это можно и в макросе и не в макросе делать )

LogRus, макросы - это не зло. А спорить не буду )
Записан

nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 05-06-2007 15:59 » 

Алексей, на самом деле высказывание "макросы - зло" родили корефеи программинга, ты же не будешь спорить, что "goto - зло"?
А про функцию я спросил просто потому, что не понял, в чем смысл оборачивать функцию макроса. Получается, что макрос чисто ради макроса.
Записан

ещё один вопрос ...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #9 : 06-06-2007 04:25 » 

nikedeforest, GOTO - я это просто никогда не использую.  Но и ты же не скажешь, что алкоголь - это зло? Ага

>>Получается, что макрос чисто ради макроса.
вовсе нет. Просто как одну глобальную функцию оформить не удасться, потому что туда нельзя будет подставить имя типа данных.
Или шаблон или макрос, иного нету
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 06-06-2007 08:54 » 

А с макросом тоже не получится, тк в итоге тебе надо вызывать всё-таки ф-ю с определённым типом. С шаблоном можно попробовать. Но шаблоны работают на этапе выполнения, на этапе компиляции объектов может вобще ещё не существовать. Но зачем такие заморочки?

Сделай родительский класс

Код:
class CMyDefinedClass
{
       CMyDefinedClass() { m_stClassName = _T("undefined"); }
       CMyDefinedClass(CString stClassName) { SetClassName(stClassName); }

       CString GetClassName() { return m_stClassName; }
       void SetClassName(CString stClassName) { m_stClassName = stClassName; }

       BOOL IsKindOf(const CString &stClassName)
       {
           return (BOOL)(m_stClassName.Compare(stClassName)==0);
       }

private:
     CString m_stClassName;
};

и все свои объекты наследуй от него с инициаллизацией ессно. Кстати MFC работает почти так-же IsKindOf. ТОлько запись информации о классе осуществляется в макросах DECLARE_XXX

Это в том случае если я правильно понял, что ты хочешь. Не думаю, что тебе просто надо проверять тип объекта передаваемого в ф-ю. Реакция на это уже и так есть, или в форме ошибки, или в форме предупреждения. Так что...
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #11 : 06-06-2007 08:59 » 

Джон, как-то есть макрос не работает ? У меня уже работает )

и именно на этапе компиляции.
И мне этого макроса достаточно уже...
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 06-06-2007 09:17 » 

"Не верю!" (с) Покажи. Ага

зы на этапе компиляции я говорил про шаблон
« Последнее редактирование: 06-06-2007 09:18 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #13 : 06-06-2007 09:28 » 

Джон, пост #2 )
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #14 : 06-06-2007 11:05 » 

Но шаблоны работают на этапе выполнения, на этапе компиляции объектов может вобще ещё не существовать. Но зачем такие заморочки?

А вот тут ты не прав. Предложеный мной шаблон будет работать на этапе компиляции, опять же не стоить забывать о такой вещи, как метапрограммирование с использование шаблонов.
Записан

Странно всё это....
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #15 : 06-06-2007 11:11 » 

А ну всё понятно. У меня просто на "всё читать" времени нет, и раз темка продолжается я думал решения ещё нет. Те тебе надо то, про что я меньше всего думал. Те фактически ты сдела макрос, который проверяет, а такого ли типа переменная, как я её объявил. Но ума не приложу - ЗАЧЕМ???

Ведь если у тебя есть ф-я с параметром типаА, а ты передаёшь в неё параметр типаБ, то всё-равно получишь замечание или ошибку. На этапе компиляции. Тебе даже место покажут. Так зачем огрод городить?

Это вопрос риторический, а не призыв к дискуссии. Тебе конечно видней. "Просто хотелось бы узнать, в какой части
Восточной Магистрали устраиваются люди." (с)
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #16 : 06-06-2007 11:16 » 

LogRus, там вобще-то модальный глагол стоит - "может". ЕЩЁ раз я не всё прочитал и не во все коды вникал!!! Я не имел ввиду именно ТВОЙ шаблон, у меня нет времени проверять АБСОЛЮТНО ВСЁ. Ага

Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #17 : 06-06-2007 11:26 » 

да я как бы уже нашёл решение. Улыбаюсь Если хотите - можете и развить...

Джон, это мне только надо ) Патамучта я привык к макросам, вот такой я плохой )) . А функции тут ни при чём - иногда мне надо в макросе не ошибиться и  именно определённый тип сунуть туда.

теперь я наконец понял, зачем шаблоны - именно для контроля типа ) Больше от макроса ничем для меня они не отличаются...
Поразбираюсь на досуге )
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #18 : 06-06-2007 11:45 » 

теперь я наконец понял, зачем шаблоны - именно для контроля типа ) Больше от макроса ничем для меня они не отличаются...
Поразбираюсь на досуге )

Ну ладно пускай, хотя ты и не прав.

LogRus, там вобще-то модальный глагол стоит - "может". ЕЩЁ раз я не всё прочитал и не во все коды вникал!!! Я не имел ввиду именно ТВОЙ шаблон, у меня нет времени проверять АБСОЛЮТНО ВСЁ. Ага

Мой разорвёт именно при компиляции. Улыбаюсь
Записан

Странно всё это....
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #19 : 06-06-2007 11:46 » 

Да нет, я не про макросы и ф-ции (я одинаково лояльно отношусь и к тем и к другим, а так же к goto и водке). Я про смысл этой проверки вобще, что можно выяснить увидев, например, ошибку компилятора?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #20 : 06-06-2007 11:50 » 

LogRus,
>>Мой разорвёт именно при компиляции
  --прямо бонбу соорудил Отлично Отлично  Ахтомную )

Джон, я ж сушшество по сути своей косячное )  просто самоконтроль

кстати, если кто обратил внимание - там написано у меня  #ifdef _DEBUG )

часто также делаю вставки в конструкторы структур - например
#ifdef _DEBUG
  if(sizeof(*this)!=17)throw;
#endif

- это когда надо не забыть что то подправить, если что то добавил в структуру. При запуске в дебаге место ловится , а вот проверка
 #if ...
 #error "ошибка"
 #endif

 - почему то не во всех случаях срабатывает (
« Последнее редактирование: 06-06-2007 11:55 от Алексей1153++ » Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines