typeof его дери.
От: black_wolf_ltd  
Дата: 07.11.06 00:13
Оценка:
Господа!
Имеются ли среди вас джедаи, овладевшие дао пострения данной идиомы в рамках стандарта, не испльзуя при этом буст ?

Если да, то пожалуста научите Силе
Re: typeof его дери.
От: ArtDenis Россия  
Дата: 07.11.06 06:27
Оценка:
black_wolf_ltd wrote:
> Имеются ли среди вас джедаи, овладевшие дао пострения данной идиомы в
> рамках стандарта, не испльзуя при этом буст ?

В рамках существующего стандарта нормальная удобная реализация typeof не
изобретена (и скорее всего невозможна). Так что либо можешь о нём
забыть, либо использовать расширения компиляторов, реализующие typeof
Posted via RSDN NNTP Server 2.0
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re: typeof его дери.
От: Sm0ke Россия ksi
Дата: 07.11.06 08:38
Оценка:
Здравствуйте, black_wolf_ltd, Вы писали:

__>Господа!

__>Имеются ли среди вас джедаи, овладевшие дао пострения данной идиомы в рамках стандарта, не испльзуя при этом буст ?

__>Если да, то пожалуста научите Силе


А какая цель?
Может без него можно обойтись?
Re: typeof его дери.
От: astral_marine  
Дата: 07.11.06 09:15
Оценка:
__>Имеются ли среди вас ... овладевшие дао пострения данной идиомы в рамках стандарта, не испльзуя при этом буст?
Это виртуальные функции. Поведение объекта должно определятся в его методах и может изменятся в его производных классах. Языки поддерживающие typeof провоцируют написание плохо расширяемого и модифицируемого кода. В С++ можно использовать dynamic_cast, но это на крайний случай для внесения исправлений в суперкривые программы.
Re[2]: typeof его дери.
От: night beast СССР  
Дата: 07.11.06 09:38
Оценка:
Здравствуйте, astral_marine, Вы писали:

__>>Имеются ли среди вас ... овладевшие дао пострения данной идиомы в рамках стандарта, не испльзуя при этом буст?


будет в следующем стандарте языка.
а пока используем g++

_>Это виртуальные функции. Поведение объекта должно определятся в его методах и может изменятся в его производных классах. Языки поддерживающие typeof провоцируют написание плохо расширяемого и модифицируемого кода. В С++ можно использовать dynamic_cast, но это на крайний случай для внесения исправлений в суперкривые программы.


хм. а sizeof на что провоцирует?
Re[2]: typeof его дери.
От: Roman Odaisky Украина  
Дата: 07.11.06 15:45
Оценка:
Здравствуйте, astral_marine, Вы писали:

__>>Имеются ли среди вас ... овладевшие дао пострения данной идиомы в рамках стандарта, не испльзуя при этом буст?

_>Это виртуальные функции. Поведение объекта должно определятся в его методах и может изменятся в его производных классах. Языки поддерживающие typeof провоцируют написание плохо расширяемого и модифицируемого кода. В С++ можно использовать dynamic_cast, но это на крайний случай для внесения исправлений в суперкривые программы.

Согласен с последним утверждением — место dynamic_cast в assert в polymorphic_downcast, и только там. (<—IMHO!)

А по поводу первых пунктов я бы возразил. Виртуальные функции хороши, но оверхед!©

И было бы приятно писать
std::deque cont;
. . .
foreach(i, cont)
{
    i.foo();
    bar(i);
}
— как это без typeof^H^H^H^H^H^Hdecltype?
До последнего не верил в пирамиду Лебедева.
Re: typeof его дери.
От: Roman Odaisky Украина  
Дата: 07.11.06 15:46
Оценка:
Здравствуйте, black_wolf_ltd, Вы писали:

__>Имеются ли среди вас джедаи, овладевшие дао пострения данной идиомы в рамках стандарта, не испльзуя при этом буст ?


За что?

Если кто и придумает рабочий typeof в рамках C++03, то это будет Boost
До последнего не верил в пирамиду Лебедева.
Re[3]: typeof его дери.
От: michus Россия  
Дата: 07.11.06 16:04
Оценка: +1 :)))
Здравствуйте, night beast, Вы писали:

NB>хм. а sizeof на что провоцирует?


На memcpy для объектов не POD типов
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: typeof его дери.
От: black_wolf_ltd  
Дата: 07.11.06 17:46
Оценка:
Здравствуйте, Sm0ke, Вы писали:

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


__>>Господа!

__>>Имеются ли среди вас джедаи, овладевшие дао пострения данной идиомы в рамках стандарта, не испльзуя при этом буст ?

__>>Если да, то пожалуста научите Силе


S>А какая цель?

S>Может без него можно обойтись?

цель очень проста — чтобы работало


#define BE(_cont___) (_cont___) .begin(), (_cont___) .end()

#define CallInCONTtheMEMFN(_cont___, _memfn___) \
    std::for_each(BE(_cont___), std::mem_fun_ref(& typeof (_cont___) :: _memfn___))


a не

#define BE(_cont___) (_cont___) .begin(), (_cont___) .end()

#define CallInCONTofTYPEtheMEMFN(_cont___, _type___, _memfn___) \
    std::for_each(BE(_cont___), std::mem_fun_ref(& _type___ :: _memfn___))
А что есть?
От: Olegator  
Дата: 07.11.06 19:56
Оценка:
А какие существуют, пусть не полностью работоспособные, реализации typeof? Какие идеи у них в основе, и если можно минимальный код — буст перелопачивать не улыбается.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[3]: typeof его дери.
От: WolfHound  
Дата: 07.11.06 20:55
Оценка: -1
Здравствуйте, Roman Odaisky, Вы писали:

RO>Согласен с последним утверждением — место dynamic_cast в assert в polymorphic_downcast, и только там. (<—IMHO!)

Не все так однозначно в этом мире.

RO>А по поводу первых пунктов я бы возразил. Виртуальные функции хороши, но оверхед!©

Если в этой виртуальной функции есть хоть какойто код то ты этот оверхед в микроскоп не увидишь...

RO>И было бы приятно писать

RO>
RO>std::deque cont;
RO>. . .
RO>foreach(i, cont)
RO>{
RO>    i.foo();
RO>    bar(i);
RO>}
— как это без typeof^H^H^H^H^H^Hdecltype?

Nemerle ?
using Nemerle.Collections;
using System.Console;
 
module MyApp
{
   Main () : void
   {
     // create an array containing strings (array [string])
     def elements = array ["{0}", "a {0} a", "{0}", "b {0}", "b {0}"];
 
     def hash = Hashtable ();
 
     // count the number of occurrences of each unique element
     foreach (e in elements)
     {
       unless (hash.Contains (e))
         hash[e] = 0;         
       hash[e] += 1;
     }
 
     // print each element with number indicating its total count
     foreach (keypair in hash) {
       WriteLine (keypair.Key, keypair.Value);
     }
   }
}


ЗЫ Ну в самом деле. Хватит уже старичка С++ насиловать. Ну не приспособлен этот язык к таким выкрутасам. Если хочется чего-то навороченного есть языки в которых это есть.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: А что есть?
От: Roman Odaisky Украина  
Дата: 07.11.06 21:37
Оценка:
Здравствуйте, Olegator, Вы писали:

O>А какие существуют, пусть не полностью работоспособные, реализации typeof? Какие идеи у них в основе, и если можно минимальный код — буст перелопачивать не улыбается.


Можно использовать баги компиляторов
Автор: Chez
Дата: 28.03.05
. Вот еще один вариант (переносимый, но требует регистрировать типы ручками) валяется у меня на компе, знать бы откуда взялся.
До последнего не верил в пирамиду Лебедева.
Re[3]: typeof его дери.
От: Андрей Хропов Россия  
Дата: 07.11.06 22:09
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>И было бы приятно писать

RO>
RO>std::deque cont;
RO>. . .
RO>foreach(i, cont)
RO>{
RO>    i.foo();
RO>    bar(i);
RO>}

Лучше ";" чтобы по аналогии с for и + не путать с оператором следования.

Для меня отсутствие foreach является одим из главных недостатков C++.

А так welcome to languages with type-inference :

D:
[d]
foreach(i;cont) ...
[/d]
или с указанием индекса i
[d]
foreach(i,elem;cont) ...
[/d]
(работает также для словарей (то что в C++ называют std::map): [d]foreach(key,value; dict) ...[/d] )

Nemerle:
[nemerle]
foreach(i in cont) ...
[nemerle]
или c лямбдой
[nemerle]
cont.Iter( i => ... )
[nemerle]
, для словарей (Hashtable)
[nemerle]
cont.Iter( (key,value) => ... )
[nemerle]
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: typeof его дери.
От: johny5 Новая Зеландия
Дата: 08.11.06 12:17
Оценка:
RO>Согласен с последним утверждением — место dynamic_cast в assert в polymorphic_downcast, и только там. (<—IMHO!)


dynamic_cast может использоваться для cross_cast. У нас это используется аналогично QueryInterface в COM.
Re[3]: typeof его дери.
От: Sm0ke Россия ksi
Дата: 08.11.06 12:23
Оценка:
Здравствуйте, black_wolf_ltd

Может шаблоном?


template <class T>
struct Type2Type
{
    typedef T OriginalType;
};

class some // наш класс
{
    template <class A>
    static void method(some & obj);
    /* тут должены быть begin() и end() возвращающие итераторы */
};

struct rotate;

template <>
void some::method<rotate>(some & obj)
{
    //
}

template <class T, class A>
void call_in_context(T & obj, Type2Type<A>)
{
    std::for_each(obj.begin(), obj.end(), std::mem_fun_ref(&T::method<A>));
}

some obj;
call_in_context(obj, Type2Type<rotate>());
Re: typeof его дери.
От: Sm0ke Россия ksi
Дата: 10.11.06 11:48
Оценка: 3 (2)
Без всякого буста!

Решил эту задачу несколько минут назад =)

файл "test.cpp"

#include "type.h"

class some_class
{};

// для каждого типа должен быть свой уникальный номер
DEF_TYPE_ID(some_class, 1)

/*template <>
struct type::test<some_class>
    : public base<1>
{};

template <>
struct type::all<1>
{
    typedef some_class result;
};*/

void fn_test()
{
    some_class obj;
    GET_VAR_TYPE(obj) obj2, obj3, obj4;
    //type::all<sizeof(type::get(s).a)>::result s2;
}


файл "type.h"

struct type
{
    template <int I>
    struct all;

    template <>
    struct all<0>
    {
        typedef void result;
    };

    template <int I>
    struct base
    {
        char a[I];
    };

    template <>
    struct base<0>
    {};

    template <class T>
    struct test;

    template <>
    struct test<void>
        : public base<0>
    {};

    template <class T>
    static test<T> get(T param);
};

#define DEF_TYPE_ID(TYPE, ID)        \
    template <>                        \
    struct type::test<TYPE>            \
        : public base<ID>            \
    {};                                \
    template <>                        \
    struct type::all<ID>            \
    { typedef TYPE result; };

#define GET_VAR_TYPE(VAR)            \
    type::all                        \
    <                                \
        sizeof(type::get(VAR).a)    \
    >::result


Но чтобы тип перименной можно было определить,
этот тип надо "зарегистрировать" под уникальным int'овым индексом.
Используя макрос DEF_TYPE_ID(тип, номер)

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

__>Господа!

__>Имеются ли среди вас джедаи, овладевшие дао пострения данной идиомы в рамках стандарта, не испльзуя при этом буст ?

__>Если да, то пожалуста научите Силе
Re[2]: typeof его дери.
От: ArtDenis Россия  
Дата: 13.11.06 05:38
Оценка:
Sm0ke wrote:

> Решил эту задачу несколько минут назад =)

> ...

1. Слишком длинное решение
2. Надо придумывать уникальный номер
3. С регистрацией типов
Posted via RSDN NNTP Server 2.0
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.