Re: ISTYPE?
От: jazzer Россия Skype: enerjazzer
Дата: 18.10.04 14:08
Оценка: 7 (1)
Здравствуйте, ssm, Вы писали:

ssm>можно реализовать ISTYPE, так чтобы :


ssm>
ssm>int i;
ssm>ASSERT(ISTYPE(int) == true);
ssm>ASSERT(ISTYPE(i) == false);
ssm>ASSERT(ISTYPE(MyClass) == true);
ssm>ASSERT(ISTYPE(MyClass()) == false);

ssm>


ssm>использовать я его несобираюсь :) , просто интерестна возможность реализации данного механизма средствами C++


раз уж все так веселятся:
template <class T> void NONTYPE(const T&) {}
#define ISTYPE(T) void f(T t);

class MyClass {};
int main()
{
    int i;
    ISTYPE(int);
    NONTYPE(int());
    NONTYPE(i);
    ISTYPE(MyClass);
    NONTYPE(MyClass());
}

если написать не то — не скомпилируется
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: ISTYPE?
От: ssm Россия  
Дата: 18.10.04 14:17
Оценка:
Здравствуйте, jazzer, Вы писали:


J>раз уж все так веселятся:


не-не-не, должно компилироваться в обоих случаях
Re[2]: Первый аноним
От: Аноним  
Дата: 18.10.04 14:18
Оценка:
Здравствуйте, jazzer, Вы писали:

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


ssm>>можно реализовать ISTYPE, так чтобы :


ssm>>
ssm>>int i;
ssm>>ASSERT(ISTYPE(int) == true);
ssm>>ASSERT(ISTYPE(i) == false);
ssm>>ASSERT(ISTYPE(MyClass) == true);
ssm>>ASSERT(ISTYPE(MyClass()) == false);

ssm>>


ssm>>использовать я его несобираюсь , просто интерестна возможность реализации данного механизма средствами C++


J>раз уж все так веселятся:

J>
J>template <class T> void NONTYPE(const T&) {}
J>#define ISTYPE(T) void f(T t);

J>class MyClass {};
J>int main()
J>{
J>    int i;
J>    ISTYPE(int);
J>    NONTYPE(int());
J>    NONTYPE(i);
J>    ISTYPE(MyClass);
J>    NONTYPE(MyClass());
J>}
J>

J>если написать не то — не скомпилируется

Такая мысль тоже приходила мне в голову, но повторюсь — какой практический смысл? Я тут тоже придумал нечто, возможно работает не всегда. Проверял на VS Net 2003. Там type_info.name() для пользовательских типов возвращает строки вида "class ClassName" или "enum EnumName", так что strstr...

#define STRINGIZING(name) #name
#define STRINGIZING_(name) STRINGIZING(name)

#define IS_TYPE(t) (strstr(typeid(t).name(),STRINGIZING_(t))!=0)

Использовать так же, как хотел ssm, т.е.

ASSERT(ISTYPE(int) == true);
Re[3]: Первый аноним
От: ssm Россия  
Дата: 18.10.04 14:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А>type_info.name() для пользовательских типов возвращает строки вида "class ClassName" или "enum EnumName", так что strstr...


ну это уже чистой воды надувательство
Re[4]: Первый аноним
От: Аноним  
Дата: 18.10.04 14:32
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>Здравствуйте, Аноним, Вы писали:


А>>type_info.name() для пользовательских типов возвращает строки вида "class ClassName" или "enum EnumName", так что strstr...


ssm>ну это уже чистой воды надувательство


И вовсе не надувательство. И работает не во время компиляции, а во время исполнения.
Re[3]: ISTYPE?
От: jazzer Россия Skype: enerjazzer
Дата: 18.10.04 14:33
Оценка:
Здравствуйте, ssm, Вы писали:

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



J>>раз уж все так веселятся:

ssm> :))
ssm>не-не-не, должно компилироваться в обоих случаях

тогда
#define ISTYPE(x)


компилироваться точно будет :)
раз ты это все равно использовать не собираешься :)

или:
struct X
{
   bool operator==(bool) { return true; }
};
inline X f() { X x; return x; }
#define ISTYPE(x) f()



так даже твой пример будет компилироваться :)


потому что единственное применение этой технике, которое я вижу, — для макросов, которые хотят контролировать свои параметры на входе, дабы им не подсунули бяку
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[5]: Первый аноним
От: ssm Россия  
Дата: 18.10.04 14:40
Оценка:
Здравствуйте, Аноним, Вы писали:


А>И вовсе не надувательство. И работает не во время компиляции, а во время исполнения.


оно не работает вообще:

int x;    
std::cout << IS_TYPE(int) << IS_TYPE(x) << std::endl;


int i;    
std::cout << IS_TYPE(int) << IS_TYPE(i) << std::endl;
Re[6]: Первый аноним
От: Аноним  
Дата: 18.10.04 14:50
Оценка: :)
Здравствуйте, ssm, Вы писали:

ssm>Здравствуйте, Аноним, Вы писали:



А>>И вовсе не надувательство. И работает не во время компиляции, а во время исполнения.


ssm>оно не работает вообще:


ssm>
ssm>int x;    
ssm>std::cout << IS_TYPE(int) << IS_TYPE(x) << std::endl;


ssm>int i;    
ssm>std::cout << IS_TYPE(int) << IS_TYPE(i) << std::endl;
ssm>


Я бы не сказал, что прям вообще, хотя и не всегда . Не работает еще и с typedef, типа LPSTR. Но уж развлекаться, так развлекаться.
Re[4]: ISTYPE?
От: ssm Россия  
Дата: 18.10.04 15:03
Оценка:
Здравствуйте, jazzer, Вы писали:

J>тогда

J>
#define ISTYPE(x)


J>компилироваться точно будет

но не будет правильно работать

J>раз ты это все равно использовать не собираешься

интересен факт возможности реализации

J>или:

J>
J>struct X
J>{
J>   bool operator==(bool) { return true; }
J>};
J>inline X f() { X x; return x; }
J>#define ISTYPE(x) f()
J>



J>так даже твой пример будет компилироваться

чет я не понял, к чему этот пример вообще? может ты имел в виду
operator bool()

но смысл остается для меня все равно загадкой

J>потому что единственное применение этой технике, которое я вижу...

я уже говорил, что применять я это не собираюсь, просто спортивный интересс, так сказать-с
Re[3]: Первый аноним
От: korzhik Россия  
Дата: 18.10.04 15:22
Оценка:
Здравствуйте, Аноним, Вы писали:

>Там type_info.name() для пользовательских типов возвращает строки вида "class ClassName" или "enum EnumName", так что strstr


не стал бы я полагаться на вид строки возвращаемой type_info.name().
это не переносимо.
Re[5]: ISTYPE?
От: jazzer Россия Skype: enerjazzer
Дата: 19.10.04 07:03
Оценка: :)
Здравствуйте, ssm, Вы писали:

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


J>>тогда

J>>
#define ISTYPE(x)


J>>компилироваться точно будет :)

ssm>но не будет правильно работать :)

что значит "правильно работать" в отсутствии четко поставленной задачи?

J>>раз ты это все равно использовать не собираешься :)

ssm>интересен факт возможности реализации

J>>или:

J>>
J>>struct X
J>>{
J>>   bool operator==(bool) { return true; }
J>>};
J>>inline X f() { X x; return x; }
J>>#define ISTYPE(x) f()
J>>



J>>так даже твой пример будет компилироваться :)

ssm>чет я не понял, к чему этот пример вообще? может ты имел в виду
ssm>
ssm>operator bool()
ssm>

ssm>но смысл остается для меня все равно загадкой :xz:
нет, именно так.
Это чтобы работали выражения ISTYPE(x)==false.
Если operator bool() — тогда придется что-то возвращать, а оно может дать и другой резльтат при сравнении с false.

J>>потому что единственное применение этой технике, которое я вижу...

ssm>я уже говорил, что применять я это не собираюсь, просто спортивный интересс, так сказать-с

сейчас придет Шахтер и тебя закопает как злостного теоретика :)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[6]: ISTYPE?
От: ssm Россия  
Дата: 19.10.04 08:40
Оценка:
Здравствуйте, jazzer, Вы писали:

J>что значит "правильно работать" в отсутствии четко поставленной задачи?


хочу макрос(так как ничего другого не выйдет), такой чтобы:
-имел имя ISTYPE
-имел один параметр(тип или значение)
-успешно компилировался как для переданного типа так и для переданного значения
-"возвращал" true, если переданное значение тип и false для значений
-результат можно было бы использовать как на этапе запуска, так и на этапе компиляции


J>сейчас придет Шахтер и тебя закопает как злостного теоретика

я ведь только за , в том смысле, что меня бы вполне устроил ответ "НЕТ. НИЗЯ ТАК!!!", естественно чем-то подкрепленный
Re[7]: ISTYPE?
От: e-Xecutor Россия  
Дата: 20.10.04 07:20
Оценка:
Здравствуйте, ssm, Вы писали:

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


J>>что значит "правильно работать" в отсутствии четко поставленной задачи?


ssm>хочу макрос(так как ничего другого не выйдет), такой чтобы:

ssm>-имел имя ISTYPE
ssm>-имел один параметр(тип или значение)
ssm>-успешно компилировался как для переданного типа так и для переданного значения
ssm>-"возвращал" true, если переданное значение тип и false для значений
ssm>-результат можно было бы использовать как на этапе запуска, так и на этапе компиляции


На первый взгляд — общего решения нет.

Если я не ошибаюсь, единственное место куда пролезет
любая переменная и любой тип — typeid.
Но то, что он возвращает — implementation dependant.
К тому же с compile time тут проблемы

А что должен возвращать твой ISTYPE в таком случае:
struct S{
};

struct S S;

ISTYPE(S); //???




(true+false)/2
Re[8]: ISTYPE?
От: ssm Россия  
Дата: 20.10.04 07:58
Оценка:
Здравствуйте, e-Xecutor, Вы писали:


EX>(true+false)/2

EX>
неа, если ты передал первое S, то true, если второе, то false.
кстати:

struct S{
    int i;
};

struct P{
    int i[2];
};

struct S P;
struct P S;

int main()
{        
    std::cout << sizeof(P) << sizeof(S);

    return 0;
}

Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.