Жёсткая типизация
От: Chez Россия  
Дата: 19.10.04 11:34
Оценка:
Приветствую всех!

typedef size_t TypedCounterType;
typedef TypedCounterType CountType;
typedef TypedCounterType IndexType;

typedef size_t UntypedCounterType;
typedef UntypedCounterType SizeType;
typedef UntypedCounterType OffsetType;
и далее:
void foo()
{
    IndexType idx = 10;
    OffsetType offs;

    offs = idx; // Как сделать, чтобы это было невозможно (носвместимость типов)
                    // или хотя-бы Warning ?
}

Необязательно именно так, главное чтобы суть идеи сохранилась
Chez, ICQ# 161095094
Re: Жёсткая типизация
От: Аноним  
Дата: 19.10.04 11:38
Оценка:
Здравствуйте, Chez, Вы писали:

C>Приветствую всех!


C>
C>typedef size_t TypedCounterType;
C>typedef TypedCounterType CountType;
C>typedef TypedCounterType IndexType;

C>typedef size_t UntypedCounterType;
C>typedef UntypedCounterType SizeType;
C>typedef UntypedCounterType OffsetType;
C>
и далее:

C>
C>void foo()
C>{
C>    IndexType idx = 10;
C>    OffsetType offs;

C>    offs = idx; // Как сделать, чтобы это было невозможно (носвместимость типов)
C>                    // или хотя-бы Warning ?
C>}
C>

C>Необязательно именно так, главное чтобы суть идеи сохранилась

А в чем суть идеи-то? Можно реализовать TypedCounterType и UntypedCounterType как классы, тогда присваивание по умолчанию работать не будет. typedef не вводит новый тип — только другое имя для уже существующего типа.
Re: Жёсткая типизация
От: jazzer Россия Skype: enerjazzer
Дата: 19.10.04 11:38
Оценка:
Здравствуйте, Chez, Вы писали:

C>Приветствую всех!


C>
C>typedef size_t TypedCounterType;
C>typedef TypedCounterType CountType;
C>typedef TypedCounterType IndexType;

C>typedef size_t UntypedCounterType;
C>typedef UntypedCounterType SizeType;
C>typedef UntypedCounterType OffsetType;
C>
и далее:

C>
C>void foo()
C>{
C>    IndexType idx = 10;
C>    OffsetType offs;

C>    offs = idx; // Как сделать, чтобы это было невозможно (носвместимость типов)
C>                    // или хотя-бы Warning ?
C>}
C>

C>Необязательно именно так, главное чтобы суть идеи сохранилась

только отказаться от typedef и объявить полноценные пользовательские типы
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]: Жёсткая типизация
От: Chez Россия  
Дата: 19.10.04 11:51
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>А в чем суть идеи-то? Можно реализовать TypedCounterType и UntypedCounterType как классы, тогда присваивание по умолчанию работать не будет. typedef не вводит новый тип — только другое имя для уже существующего типа.


Хм... Если сделать оператор преобразования типа
class TypedCounterType<size_t id>
{
public:
    operator int() { ... };
    ...
};
// то
typedef TypedCounterType<0> type1;
typedef TypedCounterType<1> type2;

type1 a;
type2 b;

a = b; // Увы, работает  :(
Chez, ICQ# 161095094
Re[3]: Жёсткая типизация
От: Аноним  
Дата: 19.10.04 11:57
Оценка:
Здравствуйте, Chez, Вы писали:

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


А>>А в чем суть идеи-то? Можно реализовать TypedCounterType и UntypedCounterType как классы, тогда присваивание по умолчанию работать не будет. typedef не вводит новый тип — только другое имя для уже существующего типа.


C>Хм... Если сделать оператор преобразования типа

C>
C>class TypedCounterType<size_t id>
C>{
C>public:
C>    operator int() { ... };
C>    ...
C>};
C>// то
C>typedef TypedCounterType<0> type1;
C>typedef TypedCounterType<1> type2;

C>type1 a;
C>type2 b;

C>a = b; // Увы, работает  :( 
C>



Я, видимо, что-то не так понял, но

class TypedCounterType<size_t id>

не компилируется, а если написать

template<size_t id> class TypedCounterType ...

то

а=b;

выдает ошибку "нет оператора присваивания"
У меня VS.NET 2003
Re[4]: Жёсткая типизация
От: Chez Россия  
Дата: 19.10.04 12:37
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Я, видимо, что-то не так понял, но


А>class TypedCounterType<size_t id>

да, здесь я ошибся. Я имел ввиду вот это:
template<class Type, int id>
class TypedCounterType
{
public:
    operator Type&() { return n; };
    Type n;
};
// то
typedef TypedCounterType<double, 1> type1;
typedef TypedCounterType<double, 2> type2;

type1 a;
type2 b;

a = b; // Увы, работает  :(
Chez, ICQ# 161095094
Re[5]: Жёсткая типизация
От: Аноним  
Дата: 19.10.04 12:46
Оценка:
Все равно не работает: Visual C++ .NET 2003
Re: Жёсткая типизация
От: yxiie Украина www.enkord.com
Дата: 19.10.04 15:53
Оценка: 1 (1)
Здравствуйте, Chez, Вы писали:

C>Приветствую всех!


C>
C>typedef size_t TypedCounterType;
C>typedef TypedCounterType CountType;
C>typedef TypedCounterType IndexType;

C>typedef size_t UntypedCounterType;
C>typedef UntypedCounterType SizeType;
C>typedef UntypedCounterType OffsetType;
C>
и далее:

C>
C>void foo()
C>{
C>    IndexType idx = 10;
C>    OffsetType offs;

C>    offs = idx; // Как сделать, чтобы это было невозможно (носвместимость типов)
C>                    // или хотя-бы Warning ?
C>}
C>

C>Необязательно именно так, главное чтобы суть идеи сохранилась

так подойдет? :

#include <iostream>

template <class T, class ID> 
class wrap {
    typename T data_;
public:
    wrap() {}
  wrap(const T& init): data_(init) {}

    operator typename T() {
        return data_;
    }
};

typedef wrap<int, class id1> type1;
typedef wrap<int, class id2> type2;

int main() {
    type1 a1, b1=5;
    type2 a2=1;

    a1=b1;  // ok
    a1=4;   // ok
    a1=a2;  // не компилится

    std::cout<<a1<<std::endl;
}
... << RSDN@Home 1.1.3 stable >>
Re[2]: Жёсткая типизация
От: McSeem2 США http://www.antigrain.com
Дата: 19.10.04 18:15
Оценка:
Здравствуйте, yxiie, Вы писали:

Y>
Y>#include <iostream>

Y>template <class T, class ID> 
Y>class wrap {
Y>    typename T data_;
Y>public:
Y>    wrap() {}
Y>  wrap(const T& init): data_(init) {}

Y>    operator typename T() {
Y>        return data_;
Y>    }
Y>};

Y>typedef wrap<int, class id1> type1;
Y>typedef wrap<int, class id2> type2;

Y>int main() {
Y>    type1 a1, b1=5;
Y>    type2 a2=1;

Y>    a1=b1;  // ok
Y>    a1=4;   // ok
Y>    a1=a2;  // не компилится

Y>    std::cout<<a1<<std::endl;
Y>}
Y>


А как насчет:
    a1 += 10;
    ++a1;

Все это надоть явно перегружать. Это не просто лишняя работа, иногда это приводит в конфликтам с тем же оператором T(). Вообще, для хорошей переносимости не стоит увлекаться перегрузкой операторов и особенно, типа T().

Что и говорить, не хватает в C++ простого добавления новых типов. Что-то типа:
introduce_type int my_integral;

А так же, чего-нибудь типа такого:
introduce_template std::vector<class T, my_allocator> vector_with_my_allocator<class T>;
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[3]: Жёсткая типизация
От: yxiie Украина www.enkord.com
Дата: 19.10.04 18:21
Оценка:
Здравствуйте, McSeem2, Вы писали:

MS>А как насчет:

MS>
MS>    a1 += 10;
MS>    ++a1;
MS>

MS>Все это надоть явно перегружать. Это не просто лишняя работа, иногда это приводит в конфликтам с тем же оператором T(). Вообще, для хорошей переносимости не стоит увлекаться перегрузкой операторов и особенно, типа T().

доработать напильником до полного удовлетворения

MS>Что и говорить, не хватает в C++ простого добавления новых типов. Что-то типа:

MS>
MS>introduce_type int my_integral;
MS>

MS>А так же, чего-нибудь типа такого:
MS>
MS>introduce_template std::vector<class T, my_allocator> vector_with_my_allocator<class T>;
MS>


Да не говори, все тебе чего-то в С++ нехватает, то типов, то препроцессора. Ты случайно не паскалист?
... << RSDN@Home 1.1.3 stable >>
Re[4]: Жёсткая типизация
От: McSeem2 США http://www.antigrain.com
Дата: 19.10.04 18:29
Оценка:
Здравствуйте, yxiie, Вы писали:

Y>Да не говори, все тебе чего-то в С++ нехватает, то типов, то препроцессора.


Не препроцессора, а макро-процессора. Сколько можно талдычить?
Препроцессирование как отдельный процесс — маздай.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[5]: Жёсткая типизация
От: bkat  
Дата: 19.10.04 19:51
Оценка:
Здравствуйте, McSeem2, Вы писали:

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


Y>>Да не говори, все тебе чего-то в С++ нехватает, то типов, то препроцессора.


MS>Не препроцессора, а макро-процессора. Сколько можно талдычить?

MS>Препроцессирование как отдельный процесс — маздай.

Думаю макропроцессор от древнего и уже почти забытого PL/1 тебе бы понравился.
В нем есть и свои встроенные типы данных (включая естественно строковые)
и процедуры с функциями и кажется даже операторы ввода/вывода.
В общем на макропроцессоре PL/1 вполне реально писать самые обычные программы.
Re[3]: Жёсткая типизация
От: jazzer Россия Skype: enerjazzer
Дата: 20.10.04 01:14
Оценка: 14 (1)
Здравствуйте, McSeem2, Вы писали:

MS>Что и говорить, не хватает в C++ простого добавления новых типов. Что-то типа:

MS>
MS>introduce_type int my_integral;
MS>

Если мне память не изменяет, на эту тему есть соответствующий proposal.


MS>А так же, чего-нибудь типа такого:

MS>
MS>introduce_template std::vector<class T, my_allocator> vector_with_my_allocator<class T>;
MS>

А это называется template typedef и такой proposal есть точно.
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]: Жёсткая типизация
От: McSeem2 США http://www.antigrain.com
Дата: 20.10.04 01:48
Оценка:
Здравствуйте, bkat, Вы писали:

B>Думаю макропроцессор от древнего и уже почти забытого PL/1 тебе бы понравился.


Почему "бы"? Именно он мне и нравился Но это было в 85-86 годах прошлого века.
Потом пошел MACRO-11, который был значительно хуже. Потом — сишный, который просто халтура по сравнению с MACRO-11. Такие дела...
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re: Жёсткая типизация
От: folk Россия  
Дата: 20.10.04 05:48
Оценка:
Здравствуйте, Chez, Вы писали:

C>Приветствую всех!


C>
C>typedef size_t TypedCounterType;
C>typedef TypedCounterType CountType;
C>typedef TypedCounterType IndexType;

C>typedef size_t UntypedCounterType;
C>typedef UntypedCounterType SizeType;
C>typedef UntypedCounterType OffsetType;
C>
и далее:

C>
C>void foo()
C>{
C>    IndexType idx = 10;
C>    OffsetType offs;

C>    offs = idx; // Как сделать, чтобы это было невозможно (носвместимость типов)
C>                    // или хотя-бы Warning ?
C>}
C>

C>Необязательно именно так, главное чтобы суть идеи сохранилась

Для целочисленных проще всего использовать перечисления, приведение enum->integer неявное, а приведение integer->enum явное.
enum IndexType { IndexTypeMin = 0, IndexTypeMax = UINT_MAX };
enum OffsetType { OffsetTypeMin = 0, OffsetTypeMax = UINT_MAX };

void foo()
{
    IndexType idx = (IndexType)10;
    OffsetType offs;

    offs = idx; // error
}
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[3]: Жёсткая типизация
От: folk Россия  
Дата: 20.10.04 06:01
Оценка: +1
Здравствуйте, McSeem2, Вы писали:

MS>Что и говорить, не хватает в C++ простого добавления новых типов. Что-то типа:

MS>
MS>introduce_type int my_integral;
MS>

Какие операции с my_integral должны унаследоваться от int, а какие нет?
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re: Жёсткая типизация
От: Anton V. Kolotaev  
Дата: 20.10.04 07:02
Оценка:
Здравствуйте, Chez, Вы писали:

C>
C>typedef size_t TypedCounterType;
C>typedef TypedCounterType CountType;
C>typedef TypedCounterType IndexType;

C>typedef size_t UntypedCounterType;
C>typedef UntypedCounterType SizeType;
C>typedef UntypedCounterType OffsetType;
C>
и далее:

C>
C>void foo()
C>{
C>    IndexType idx = 10;
C>    OffsetType offs;

C>    offs = idx; // Как сделать, чтобы это было невозможно (носвместимость типов)
C>                    // или хотя-бы Warning ?
C>}
C>

C>Необязательно именно так, главное чтобы суть идеи сохранилась


Я, например, иногда в подобных случаях делаю так:

enum TypeCounterType {};

inline TypeCounterType toTypeCounterType(int i) { return static_cast<TypeCounterType>(i); }

// определим нужные нам операторы (их оказывается, как правило, немного)
inline TypeCounterType & operator ++ (TypeCounterType & t)
{
    return t = toTypeCounterType(t + 1);
}

enum UntypedCounterType {};
Re[2]: Жёсткая типизация
От: Chez Россия  
Дата: 20.10.04 07:39
Оценка:
Здравствуйте, yxiie, Вы писали:


Y>так подойдет? :

не совсем:

#include <iostream>

template <class T, class ID> 
class wrap {
    typename T data_;
public:
    wrap() {}
  wrap(const T& init): data_(init) {}

    operator typename T() {
        return data_;
    }
};

typedef wrap<int, class id1> type1;
typedef wrap<int, class id2> type2;

int main() {
    type1 a1, b1=5;
    type2 a2=1;

    a1=b1;  // ok
    a1=4;   // ok
    a1=a2;  // не компилится
    int r = a1 + a2; // компилится

    std::cout<<a1<<std::endl;
}
Chez, ICQ# 161095094
Re[4]: Жёсткая типизация
От: jazzer Россия Skype: enerjazzer
Дата: 20.10.04 09:47
Оценка:
Здравствуйте, folk, Вы писали:

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


MS>>Что и говорить, не хватает в C++ простого добавления новых типов. Что-то типа:

MS>>
MS>>introduce_type int my_integral;
MS>>

F>Какие операции с my_integral должны унаследоваться от int, а какие нет?

очевидно, все, но с заменой int на my_integral.
и, естественно, запрет неявного преобразования одного в другое.
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[3]: Жёсткая типизация
От: vdimas Россия  
Дата: 20.10.04 15:57
Оценка: 1 (1)
Здравствуйте, Chez, Вы писали:

Y>>так подойдет? :

C>не совсем:

убрать operator typename T(),

добавить тонну других операторов (как мемберов, так и френдов),
включая потоковые << >>,

тогда пойдет.

Давно бы кто-нить сваял для числовых типов, да выложил для общего пользования.
иногда нада.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.