ответ на плюсах (Was: детский вопрос по Си)

Julie16


#include <set>
#include <iostream>

template< class A >
static std::set<A> create_set( const A a[] )
{
std::set< A > ret;
for ( size_t i = 0; i < sizeof( a ) / sizeof( A ); i )
{
ret.insert( a[i] );
}

return ret;
}

#define DEFINE_SET( __type, __a, x... )\
static __type __a##___[] = x;\
static std::set< __type > __a = create_set< __type >( __a##___ );

#define IN_SET( __s, __key )\
__s.find( __key ) != __s.end

DEFINE_SET( char, digits, { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' } );

int main
{
char key = '1';

if ( IN_SET( digits, key ) )
{
std::cout << "ok\n";
}
}

<>
<>

bastii

ууу, хардкорный С plus plus пошел

voronina

угу, люди старались, придумывали using namespace, inline
нет надо все сделать макросами
на C бы тогда писал

rosali

Пока в С не будет человеческой рефлексии (цикл по всем полям структуры, условие совпадения типов двух выражений, и т.п.) люди будут писать макры.

voronina

чем inline версия тогоже самого хуже?
а то приходится думать, что в каком порядке задефайнено, если прога большая.
дефайнами хорошо делать проверки на операционку, компиляторы, библиотеки, дебуг-релиз
а если мы сделать подпрограмму, почему нужен особый синтаксис, отличающийся от стандартного определения процедур.
З.Ы. это относится только к плюсам, под голыми сями без макросов живется плохо

a_tischkevich

Судя по всему, ты этот код не компилировал.
Иначе заметил бы лажу

Julie16

Ышо как компилировал. И в чем лажа?

a_tischkevich

И запускал?
for ( size_t i = 0; i < sizeof( a ) / sizeof( A ); i )
Отсутствие инкремента у i будем считать опечаткой.
После того, как исправишь, добавь в main что-нибудь типа
cout << digits.size;
или
if ( IN_SET( digits, '9' ) )
{
std::cout << "ok\n";
}
и сообщи, что выдаст. Мне правда интересно.

Julie16

Ну у i нет ++ из-за Шаллера Но конечно я ступил

rosali

Да как можно написать через inline DEFINE_SET? Эта макра переменные вводит.
Оставить комментарий
Имя или ник:
Комментарий: