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'
Да, этот момент я не знаю пока что, как реализовать лучше.
Можно только упростить:
.... <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, Вы писали:
C>Да, этот момент я не знаю пока что, как реализовать лучше. C>Можно только упростить: C>Тогда ваш пример будет работать нормально. Но! теперь не будут расспознаваться ни ссылки, ни модификаторы const и volatile. Хотя, возможно, это и не нужно...
Наверное нет. По крайней мере те компиляторы которые имеют встроенный typeof отбрасывают внешние референсы и сонстанты.
В таком случае у меня только одна проблема с вашей имплементацией -- это не C++ .
Здравствуйте, Chez, Вы писали:
А>>В таком случае у меня только одна проблема с вашей имплементацией -- это не C++ . C> не С++? C> пусть, но тем не менее оно компилируется
C>Если сделать type_of(), который будет переопределяться для каждого компилятора по-своему, то для VC7+ C>вполне можно будет использовать и это.
Есть ещё одна полезная вещь, которую я хотел бы видеть в 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). Польза проявится при использовании других макросов, например
Здравствуйте, Chez, Вы писали:
C>Если сделать type_of(), который будет переопределяться для каждого компилятора по-своему, то для VC7+ C>вполне можно будет использовать и это.
Как насчет того чтобы включить ваш код в BOOST_TYPEOF? Ecли немножко подправить -- будет работать не только в VC7+, но и в VC7-. У нас есть еще месяца 2-3 до ревью.
Здравствуйте, <Аноним>, Вы писали:
А>Как насчет того чтобы включить ваш код в BOOST_TYPEOF? Ecли немножко подправить -- будет работать не только в VC7+, но и в VC7-. У нас есть еще месяца 2-3 до ревью.
Да запросто, я буду только рад.
Только вот как запустить его на VC7- я пока что не имею представления:
нужно как-то организовать счётчик без __if_exists/__if_not_exists.
Если сделать счётчик, то должно заработать и в более ранних версиях.
Здравствуйте, 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?
Здравствуйте, <Аноним>, Вы писали:
А>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
Здравствуйте, Аноним, Вы писали:
А>Можно я по-английски а то у меня проблемы с руской клавиатурой? Скажите если нет...
А>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" -- возвращается обратно. Ето правильный адрес?
Здравствуйте, <Аноним>, Вы писали:
А>Почему-то не могу послать email на "chess@nightmail.ru" -- возвращается обратно. Ето правильный адрес?
не правильный, он раньше у меня был. умер под толщей спама
а где вы его увидели?