type_of() evil implementation for VC7
От: Chez Россия  
Дата: 28.03.05 08:52
Оценка: 166 (14) :)
// type_of() evil implementation for VC7
//
// (c) Chez
// mailto:chezu@pisem.net

#include "stdafx.h"

// This file contains:
// 1) type_id(type)
// 2) var_type_id(expersssion)
// 3) type_of(expression)

// IMPLEMENTATION
template<int ID>
class CTypeRegRoot
{
public:
    class id2type;
};

template<typename T, int ID>
class CTypeReg : public CTypeRegRoot<ID>
{
public:
    class CTypeRegRoot<ID>::id2type // This uses nice VC6-VC7 bugfeature
    {
    public:
        typedef T Type;
    };

    typedef void Dummy;
};

template<int N>
class CCounter;

// TUnused is required to force compiler to recompile CCountOf class
template<typename TUnused, int NTested = 0>
class CCountOf
{
public:
    enum
    {
        __if_exists(CCounter<NTested>) { count = CCountOf<TUnused, NTested + 1>::count }
        __if_not_exists(CCounter<NTested>) { count = NTested }
    };
};

template<class TTypeReg, class TUnused, int NValue> // Helper class
class CProvideCounterValue
{
public:
    enum { value = NValue };
};

// type_id
#define type_id(type) \
    (CProvideCounterValue< \
        /*register TYPE--ID*/ typename CTypeReg<type, CCountOf<type >::count>::Dummy, \
        /*increment compile-time Counter*/ CCounter<CCountOf<type >::count>, \
        /*pass value of Counter*/CCountOf<type >::count \
     >::value)

// Lets type_id() be > than 0
class __Increment_type_id { enum { value = type_id(__Increment_type_id) }; };

template<int NSize>
class sized
{
private:
    char m_pad[NSize];
};

template<typename T>
typename sized<type_id(T)> VarTypeID(T&);
template<typename T>
typename sized<type_id(const T)> VarTypeID(const T&);
template<typename T>
typename sized<type_id(volatile  T)> VarTypeID(volatile T&);
template<typename T>
typename sized<type_id(const volatile T)> VarTypeID(const volatile T&);

// Unfortunatelly, var_type_id() does not recognize references
#define var_type_id(var) \
    (sizeof(VarTypeID(var)))
    
// type_of
#define type_of(expression) \
    /* This uses nice VC6-VC7 bugfeature */ \
    CTypeRegRoot<var_type_id(expression)>::id2type::Type

// auto_operator
#define auto_operator(arg1, arg2, op) \
    type_of(instance(arg1) op instance(arg2)) operator op


// TEST    
class A
{
public:
    friend static const char* operator +(const A& a, const A& b)
    {
        return "chijik-pijik";
    }
};

template<typename T>
class Plus
{
public:
    friend static type_of(T() + T()) operator +(const Plus<T>& a, const Plus<T>& b)
    {
        return a.m + b.m;
    }

    T m;
};

int _tmain(int argc, _TCHAR* argv[])
{
    Plus<A> a1, a2;
    const char* x = a1 + a2;

    return 0;
}

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:silent

Re: type_of() evil implementation for VC7
От: Аноним  
Дата: 28.03.05 15:03
Оценка:
Здравствуйте, Chez, Вы писали:

// type_of() evil implementation for VC7
. . .


Если написать в VC71:

type_of(std::make_pair(1, 3.14)) y = std::make_pair(1, 3.14);

компилятор жалуется:

------ Build started: Project: type_of, Configuration: Debug Win32 ------

Compiling...
main.cpp
c:\ark\type_of\main.cpp(123) : error C2668: 'VarTypeID' : ambiguous call to overloaded function
c:\ark\type_of\main.cpp(77): could be 'sized<NSize> VarTypeID<std::pair<_Ty1,_Ty2>>(const T &)'
with
[
NSize=7,
_Ty1=int,
_Ty2=double,
T=std::pair<int,double>
]
c:\ark\type_of\main.cpp(79): or 'sized<NSize> VarTypeID<std::pair<_Ty1,_Ty2>>(volatile T &)'
with
[
NSize=6,
_Ty1=int,
_Ty2=double,
T=std::pair<int,double>
]
while trying to match the argument list '(std::pair<_Ty1,_Ty2>)'
with
[
_Ty1=int,
_Ty2=double
]
c:\ark\type_of\main.cpp(123) : error C2955: 'CTypeRegRoot' : use of class template requires template argument list
c:\ark\type_of\main.cpp(19) : see declaration of 'CTypeRegRoot'
c:\ark\type_of\main.cpp(123) : error C2955: 'CTypeRegRoot' : use of class template requires template argument list
c:\ark\type_of\main.cpp(19) : see declaration of 'CTypeRegRoot'

Аркадий
Re[2]: type_of() evil implementation for VC7
От: VNG Беларусь https://organicmaps.app/
Дата: 28.03.05 15:54
Оценка:
Здравствуйте, <Аноним>, Вы писали:

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


А>
А>// type_of() evil implementation for VC7
А>. . .
А>


А>Если написать в VC71:


А>type_of(std::make_pair(1, 3.14)) y = std::make_pair(1, 3.14);


А>компилятор жалуется:


попробуй
type_of(std::make_pair(1.0, 3.14)) y = std::make_pair(1.0, 3.14);
... << RSDN@Home 1.1.4 beta 2 >>
Re[2]: type_of() evil implementation for VC7
От: VNG Беларусь https://organicmaps.app/
Дата: 28.03.05 16:14
Оценка:
Здравствуйте, <Аноним>, Вы писали:

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


А>
А>// type_of() evil implementation for VC7
А>. . .
А>


А>Если написать в VC71:


А>type_of(std::make_pair(1, 3.14)) y = std::make_pair(1, 3.14);


А>компилятор жалуется:


попробуй
type_of(std::make_pair(1.0, 3.14)) y = std::make_pair(1.0, 3.14);
... << RSDN@Home 1.1.4 beta 2 >>
Re[3]: type_of() evil implementation for VC7
От: Аноним  
Дата: 28.03.05 18:30
Оценка:
Здравствуйте, VNG, Вы писали:

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


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


А>>
А>>// type_of() evil implementation for VC7
А>>. . .
А>>


А>>Если написать в VC71:


А>>type_of(std::make_pair(1, 3.14)) y = std::make_pair(1, 3.14);


А>>компилятор жалуется:


VNG>попробуй

VNG>
VNG>type_of(std::make_pair(1.0, 3.14)) y = std::make_pair(1.0, 3.14);
VNG>


Не помогает.

А что, какие-то проблемы с int? Нормальный typeof должен подерживать этот case.

Аркадий
Re[2]: type_of() evil implementation for VC7
От: Chez Россия  
Дата: 29.03.05 07:25
Оценка:
Да, этот момент я не знаю пока что, как реализовать лучше.
Можно только упростить:
.... <skipped>

template<int NSize>
class sized
{
private:
    char m_pad[NSize];
};

template<typename T>
typename sized<type_id(T)> VarTypeID(T);

// Unfortunatelly, var_type_id() does not recognize references
#define var_type_id(var) \
    (sizeof(VarTypeID(var)))
    
.... <skipped>

int _tmain(int argc, _TCHAR* argv[])
{
    type_of(std::make_pair(1, 3.14)) y = std::make_pair(1, 3.14);
    return 0;
}


Тогда ваш пример будет работать нормально. Но! теперь не будут расспознаваться ни ссылки, ни модификаторы const и volatile. Хотя, возможно, это и не нужно...

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:silent

Re[3]: type_of() evil implementation for VC7
От: Аноним  
Дата: 29.03.05 10:50
Оценка:
Здравствуйте, Chez, Вы писали:

C>Да, этот момент я не знаю пока что, как реализовать лучше.

C>Можно только упростить:
C>Тогда ваш пример будет работать нормально. Но! теперь не будут расспознаваться ни ссылки, ни модификаторы const и volatile. Хотя, возможно, это и не нужно...

Наверное нет. По крайней мере те компиляторы которые имеют встроенный typeof отбрасывают внешние референсы и сонстанты.

В таком случае у меня только одна проблема с вашей имплементацией -- это не C++ .

Удачи.

Аркадий
Re[4]: type_of() evil implementation for VC7
От: Chez Россия  
Дата: 29.03.05 12:04
Оценка:
А>В таком случае у меня только одна проблема с вашей имплементацией -- это не C++ .
не С++?
пусть, но тем не менее оно компилируется

Если сделать type_of(), который будет переопределяться для каждого компилятора по-своему, то для VC7+
вполне можно будет использовать и это.

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:04 The Inexperienced Spiral Traveller — To A Loyal Friend

Re[5]: type_of() evil implementation for VC7
От: Аноним  
Дата: 29.03.05 15:07
Оценка: 1 (1)
Здравствуйте, Chez, Вы писали:

А>>В таком случае у меня только одна проблема с вашей имплементацией -- это не C++ .

C> не С++?
C> пусть, но тем не менее оно компилируется

C>Если сделать type_of(), который будет переопределяться для каждого компилятора по-своему, то для VC7+

C>вполне можно будет использовать и это.

http://lists.boost.org/MailArchives/boost/msg81690.php
Re[6]: type_of() evil implementation for VC7
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 29.03.05 19:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>http://lists.boost.org/MailArchives/boost/msg81690.php


Опередил ты меня
Мне ничего не остается, кроме как привести положительный ответ Дэйва:
http://lists.boost.org/MailArchives/boost/msg81694.php
Re: type_of() evil implementation for VC7
От: _Winnie Россия C++.freerun
Дата: 30.03.05 10:00
Оценка:
Здравствуйте, Chez, Вы писали:

Смотрел очень быстро.

1)Не скомпилировалось в VS2005beta
2)Не получилось сделать
vector<int> my_vector;
type_of(my_vector.begin()) it = my_vector.begin();
Правильно работающая программа — просто частный случай Undefined Behavior
Re[2]: type_of() evil implementation for VC7
От: Chez Россия  
Дата: 30.03.05 10:35
Оценка:
Здравствуйте, _Winnie, Вы писали:

_W>1)Не скомпилировалось в VS2005beta

_W>2)Не получилось сделать
_W>
_W>vector<int> my_vector;
_W>type_of(my_vector.begin()) it = my_vector.begin();
_W>


Вероятно, нужно внести изменения, как я уже написал здесь
Автор: Chez
Дата: 29.03.05
.

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:Sopor Aeternus — Sylla'boreal

Дополнение: this_type
От: Chez Россия  
Дата: 30.03.05 10:35
Оценка: 25 (2)
Есть ещё одна полезная вещь, которую я хотел бы видеть в C++: this_type. Что это есть я думаю всем понятно
Но с type_of-ом просто определить его в контескте класса не получится:
class A
{
public:
    type_of(this) p; // error C2355: 'this' : can only be referenced inside non-static member functions
};
Небольшой (и, к счастью, переносимый) трюк позволяет решить эту проблему:
template<typename TPrototype>
class owner_of_prototype;

template<typename TOwner>
class owner_of_prototype<void (TOwner::*)()>
{
public:
    typedef TOwner Type;
};

#define uses_this_type \
    __if_not_exists(this_type) \
    { \
        void __this_method(); \
        typedef owner_of_prototype<type_of(&__this_method)>::Type this_type; \
    }

class A
{
public:
    uses_this_type;
    this_type* p;
};
Небольшое неудобство — макрос uses_this_type. Но я думаю это мизерная плата за полученную фичу. Тем более, что его не нужно писать в начале каждого класса, как указано в примере (class A). Польза проявится при использовании других макросов, например
#define BEGIN_MESSAGE_MAP(this_type) \
мог бы выглядеть как
#define BEGIN_MESSAGE_MAP \
    uses_this_type; \
    ...

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:Sopor Aeternus — Sylla'boreal

Re[5]: type_of() evil implementation for VC7
От: Аноним  
Дата: 30.03.05 14:46
Оценка:
Здравствуйте, Chez, Вы писали:

C>Если сделать type_of(), который будет переопределяться для каждого компилятора по-своему, то для VC7+

C>вполне можно будет использовать и это.

Как насчет того чтобы включить ваш код в BOOST_TYPEOF? Ecли немножко подправить -- будет работать не только в VC7+, но и в VC7-. У нас есть еще месяца 2-3 до ревью.

Аркадий
Re[6]: type_of() evil implementation for VC7
От: Chez Россия  
Дата: 30.03.05 15:01
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Как насчет того чтобы включить ваш код в BOOST_TYPEOF? Ecли немножко подправить -- будет работать не только в VC7+, но и в VC7-. У нас есть еще месяца 2-3 до ревью.

Да запросто, я буду только рад.

Только вот как запустить его на VC7- я пока что не имею представления:
нужно как-то организовать счётчик без __if_exists/__if_not_exists.
Если сделать счётчик, то должно заработать и в более ранних версиях.

Буду думать над счётчиком.

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:Tenhi — Taival — Straying

Re[7]: type_of() evil implementation for VC7
От: Аноним  
Дата: 30.03.05 15:24
Оценка:
Здравствуйте, Chez, Вы писали:

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


А>>Как насчет того чтобы включить ваш код в BOOST_TYPEOF? Ecли немножко подправить -- будет работать не только в VC7+, но и в VC7-. У нас есть еще месяца 2-3 до ревью.

C>Да запросто, я буду только рад.

C>Только вот как запустить его на VC7- я пока что не имею представления:

C>нужно как-то организовать счётчик без __if_exists/__if_not_exists.
C>Если сделать счётчик, то должно заработать и в более ранних версиях.

C>Буду думать над счётчиком.


Можно я по-английски а то у меня проблемы с руской клавиатурой? Скажите если нет...

Actually Peder already did this -- he used the "compile-time variables" he already used for his own implementation -- the one that we are using now with vc65 and vc70, and which probably becomes obsolete once we start using yours. So, I will connect you two and you can negotiate the details. Is this OK?

Regards,
Arkadiy
Re[8]: type_of() evil implementation for VC7
От: Chez Россия  
Дата: 31.03.05 07:01
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Actually Peder already did this -- he used the "compile-time variables" he already used for his own implementation -- the one that we are using now with vc65 and vc70, and which probably becomes obsolete once we start using yours. So, I will connect you two and you can negotiate the details. Is this OK?

Ok, all right

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:silent

Re[8]: type_of() evil implementation for VC7
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 31.03.05 09:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Можно я по-английски а то у меня проблемы с руской клавиатурой? Скажите если нет...


А>Actually Peder already did this -- he used the "compile-time variables" he already used for his own implementation -- the one that we are using now with vc65 and vc70, and which probably becomes obsolete once we start using yours. So, I will connect you two and you can negotiate the details. Is this OK?


Эх, вот если бы еще кросс-пост в буст с автоматическим переводом на английский, потому что "а мужики-то не знают" (для тех, кто долго не был в Росиии — это слоган из рекламы пива)
Re[9]: type_of() evil implementation for VC7
От: Аноним  
Дата: 31.03.05 11:10
Оценка:
Здравствуйте, Chez, Вы писали:

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


А>>Actually Peder already did this -- he used the "compile-time variables" he already used for his own implementation -- the one that we are using now with vc65 and vc70, and which probably becomes obsolete once we start using yours. So, I will connect you two and you can negotiate the details. Is this OK?

C>Ok, all right

Почему-то не могу послать email на "chess@nightmail.ru" -- возвращается обратно. Ето правильный адрес?

Аркадий
Re[10]: type_of() evil implementation for VC7
От: Chez Россия  
Дата: 31.03.05 11:24
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Почему-то не могу послать email на "chess@nightmail.ru" -- возвращается обратно. Ето правильный адрес?

не правильный, он раньше у меня был. умер под толщей спама
а где вы его увидели?

вот правильные:
chezu@pisem.net
chez@ezmail.ru

Chez, ICQ#161095094

Posted via:RSDN@Home;version:1.1.3;muzikstamp:Dvar — Yalaraa T Kiin

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