Re[5]: Инстанцирование шаблонов при определенных условиях
От: centurn Россия  
Дата: 06.05.03 13:44
Оценка:
C> Странно, что линковщик. А вообще, к члену надо обратиться где-нить в конструкторе. Делаться при этом все равно ничего не будет.
К>Ага. А потом — в каждом статическом методе. Потом в каждом энуме и тайпдефе. И так далее.

Не понял. Ты о чем?
Re[5]: Инстанцирование шаблонов при определенных условиях
От: centurn Россия  
Дата: 06.05.03 13:45
Оценка:
C> А вообще, к члену надо обратиться где-нить в конструкторе.
ssm>Конструкторов может быть несколько, надо в деструктор

Ну да, согласен.
Re[2]: Инстанцирование шаблонов при определенных условиях
От: centurn Россия  
Дата: 06.05.03 13:49
Оценка:
N>Проверку валидности посредством синтаксиса можно делать в любой ф-ии после return, в твоем случае:

Тогда придется избавляться от warning 'unreachable code'...
Re[5]: Инстанцирование шаблонов при определенных условиях
От: nikholas Россия  
Дата: 06.05.03 14:01
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>Конструкторов может быть несколько, надо в деструктор


А если у класса был тривиальный деструктор? Тогда получим проигрыш в скорости
... << RSDN@Home 1.0 beta 6a >>
Re: Инстанцирование шаблонов при определенных условиях
От: Дмитро  
Дата: 06.05.03 14:02
Оценка: +1
Большое всем спасибо!

Считаю, что наиболее красивым и правильным решением действительно является проверка в деструкторе. Что-то вроде этого
~Array() { (void) sizeof(Assert<(size > 0)>); }

Естественно, это не единственной способ статической проверки.

--
Дмитрий
--
Дмитрий
Re[6]: Инстанцирование шаблонов при определенных условиях
От: Кодт Россия  
Дата: 06.05.03 14:08
Оценка:
Здравствуйте, centurn, Вы писали:

C>> Странно, что линковщик. А вообще, к члену надо обратиться где-нить в конструкторе. Делаться при этом все равно ничего не будет.

К>>Ага. А потом — в каждом статическом методе. Потом в каждом энуме и тайпдефе. И так далее.

C> Не понял. Ты о чем?


Если ты сделаешь compile-time assert (CTA) статическим членом (методом, переменной — не важно), то это не помешает клиентам обращаться к тем членам шаблона, которые от CTA не зависят.
template<bool> struct A;
template<> struct A<true> {};


template<bool b>
struct B
{
  static A<b> aaa;
  
  static void hello() { };
  
  ~B() { void* a = &aaa; }
};

main()
{
  B<false>::hello(); // без проблем.

  B<false> b; // здесь законно огребем.
}
(=^.^=) Neko ... << RSDN@Home 1.0 beta 6a >>
Перекуём баги на фичи!
Re[6]: Инстанцирование шаблонов при определенных условиях
От: ssm Россия  
Дата: 06.05.03 14:10
Оценка:
Здравствуйте, nikholas, Вы писали:

N>А если у класса был тривиальный деструктор? Тогда получим проигрыш в скорости


О каком проигрыше идет речь, если проверка выполняется в compile-time?
Re[6]: Инстанцирование шаблонов при определенных условиях
От: Дмитро  
Дата: 06.05.03 14:17
Оценка:
Здравствуйте, nikholas, Вы писали:

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


ssm>Конструкторов может быть несколько, надо в деструктор


N>А если у класса был тривиальный деструктор? Тогда получим проигрыш в скорости


Врядли.
Xуже то, что возникают сложности с использованием SEH.
Такой код уже компилироваться не будет из-за явно объявленного деструктора.
template<int size> struct Array {
     ~Array() {}
};
// . . .
__try {
     Array<3> a;
}
__finally {
}


Но как правило классы с хотя бы какой-то функциональностью имеют либо предков, которые надо удалять, либо такие члены-данные; так что от использования совместно с SEH можно сразу отказаться.

--
Дмитрий
--
Дмитрий
Re[7]: Инстанцирование шаблонов при определенных условиях
От: nikholas Россия  
Дата: 06.05.03 14:18
Оценка:
Здравствуйте, ssm, Вы писали:

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


N>>А если у класса был тривиальный деструктор? Тогда получим проигрыш в скорости


ssm>О каком проигрыше идет речь, если проверка выполняется в compile-time?


При удалении массива подобных об'ектов будет сделан цикл вызова деструкторов (которые подставятся inline и будут пустыми), и тут останется уповать только на оптимизацию, сможет ли она убрать цикл без побочных эффектов. Не все компиляторы проводят такую оптимизацию
В случае тривиального деструктора такого цикла не будет вовсе
... << RSDN@Home 1.0 beta 6a >>
Re[8]: Инстанцирование шаблонов при определенных условиях
От: ssm Россия  
Дата: 06.05.03 14:31
Оценка:
Здравствуйте, nikholas, Вы писали:

N>В случае тривиального деструктора такого цикла не будет вовсе


Это твое IMHO?
Re: Инстанцирование шаблонов при определенных условиях
От: WolfHound  
Дата: 06.05.03 14:40
Оценка: 18 (1)
Здравствуйте, Дмитро, Вы писали:
Loki рулит
Ипользовать так
template<int size>
class Array
{
    STATIC_CHECK(size>0, invalide_size);
};

////////////////////////////////////////////////////////////////////////////////
// The Loki Library
// Copyright (c) 2001 by Andrei Alexandrescu
// This code accompanies the book:
// Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design 
//     Patterns Applied". Copyright (c) 2001. Addison-Wesley.
// Permission to use, copy, modify, distribute and sell this software for any 
//     purpose is hereby granted without fee, provided that the above copyright 
//     notice appear in all copies and that both that copyright notice and this 
//     permission notice appear in supporting documentation.
// The author or Addison-Welsey Longman make no representations about the 
//     suitability of this software for any purpose. It is provided "as is" 
//     without express or implied warranty.
////////////////////////////////////////////////////////////////////////////////

// Last update: June 20, 2001

#ifndef STATIC_CHECK_INC_
#define STATIC_CHECK_INC_

namespace Loki
{
////////////////////////////////////////////////////////////////////////////////
// Helper structure for the STATIC_CHECK macro
////////////////////////////////////////////////////////////////////////////////

    template<bool CompileTimeAssertion>
    struct CompileTimeError;

    template<> 
    struct CompileTimeError<true> 
    {
        typedef void type;
    };
}

////////////////////////////////////////////////////////////////////////////////
// macro STATIC_CHECK
// Invocation: STATIC_CHECK(expr, id)
// where:
// expr is a compile-time integral or pointer expression
// id is a C++ identifier that does not need to be defined
// If expr is zero, id will appear in a compile-time error message.
////////////////////////////////////////////////////////////////////////////////

#define STATIC_CHECK(expr, msg) \
typedef char ERROR_##msg[1][(expr)]

////////////////////////////////////////////////////////////////////////////////
// Change log:
// March 20, 2001: add extra parens to STATIC_CHECK - it looked like a fun 
//     definition
// June 20, 2001: ported by Nick Thurn to gcc 2.95.3. Kudos, Nick!!!
// July 09, 2002: improved for favor of VC diagnostic and usage 
////////////////////////////////////////////////////////////////////////////////

#endif // STATIC_CHECK_INC_
... << RSDN@Home 1.0 beta 6a >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[9]: Инстанцирование шаблонов при определенных условиях
От: nikholas Россия  
Дата: 06.05.03 14:51
Оценка:
Здравствуйте, ssm, Вы писали:

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


N>>В случае тривиального деструктора такого цикла не будет вовсе


ssm>Это твое IMHO?


Что-то вроде...
Я, как человек принимавший участие в написании компилятора скажу, что тривиальность деструктора проверяется при разборе текста и эта информация доступна при определении мест, где надо вызывать деструкторы. В то время как определение отсутствия эффектов у цикла — задача не тривиальная (не ахти сложная, конечно, но все таки...)
Кстати, в нашем компиляторе для тривиального деструктора кода не генерируется ни при каком условии, а вот циклы без эффекта не удаляются — руки как-то не дошли
... << RSDN@Home 1.0 beta 6a >>
Re[7]: Инстанцирование шаблонов при определенных условиях
От: centurn Россия  
Дата: 06.05.03 15:20
Оценка:
C> Не понял. Ты о чем?
К>Если ты сделаешь compile-time assert (CTA) статическим членом (методом, переменной — не важно), то это не помешает клиентам обращаться к тем членам шаблона, которые от CTA не зависят.

Не, ну эт-то ясно. Но чаще всего статический метод либо имеет дело с экземплярами класса, либо экземпляры класса вообще нигде не создаются, либо где-то рядом есть вызов нормальных методов. А если ничего из этого не верно, то... как-то мне трудно такое представить для _шаблонного_ класса...:)
А в исходном письме имхо вообще просто массив хотелось сделать с размером, определяемым на этапе выполнения. Зачем там какие-то дикие статические методы?
Re[3]: Инстанцирование шаблонов при определенных условиях
От: Павел Кузнецов  
Дата: 06.05.03 15:47
Оценка:
Здравствуйте, Кодт, Вы писали:

C>> А зачем наследовать? Почему не объявить статический член типа Assert?


К> А зачем захламлять сегмент данных?


А его вовсе не обязательно определять, т.к. обращений к нему не будет.
Posted via RSDN NNTP Server 1.5 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[4]: Инстанцирование шаблонов при определенных условиях
От: Кодт Россия  
Дата: 06.05.03 16:53
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

C>>> А зачем наследовать? Почему не объявить статический член типа Assert?


К>> А зачем захламлять сегмент данных?


ПК>А его вовсе не обязательно определять, т.к. обращений к нему не будет.


Не будет обращений — не будет и проверки
Или я чего-то не догоняю? (тогда примером кинься, пожалуйста).
(=^.^=) Neko ... << RSDN@Home 1.0 beta 6a >>
Перекуём баги на фичи!
Re[2]: Инстанцирование шаблонов при определенных условиях
От: Дмитро  
Дата: 07.05.03 00:54
Оценка:
Здравствуйте, ssm

Рано я радовался, запихивая свой Assert в деструктор. Деструктор хоть и один, но он может и не вызываться (и как следствие, не инстанцироваться). Например, если объект создался по new, а delete ему забыли сделать, либо обращение идет к статическим членам данных.

Сергей, мог бы ты дать ссылку на Саттера, который советует проверку делать в деструкторе?

--
Дмитрий
--
Дмитрий
Re[3]: Инстанцирование шаблонов при определенных условиях
От: ssm Россия  
Дата: 07.05.03 06:48
Оценка: 1 (1)
Здравствуйте, Дмитро, Вы писали:

Д>Сергей, мог бы ты дать ссылку на Саттера, который советует проверку делать в деструкторе?


Саттера(More Exceptional C++) в электронном можешь взять у Anatolixa.Смотри главу Item 4. Extensible Templates: Via Inheritance or Traits?
Если у тебя есть бумажный вариант, то читай с 51 страницы
Re[3]: Инстанцирование шаблонов при определенных условиях
От: centurn Россия  
Дата: 07.05.03 07:14
Оценка:
Д>Рано я радовался, запихивая свой Assert в деструктор. Деструктор хоть и один, но он может и не вызываться (и Д>как следствие, не инстанцироваться). Например, если объект создался по new, а delete ему забыли сделать,

Ну, знаешь... "delete забыли сделать" — это тоже глюк, который надо исправлять. Правда, это уже не обнаружить
на этапе компиляции...

Д>либо обращение идет к статическим членам данных.


Насчет этого я уже говорил.
Re[5]: Инстанцирование шаблонов при определенных условиях
От: Павел Кузнецов  
Дата: 07.05.03 10:47
Оценка:
Здравствуйте, Кодт, Вы писали:

ПК>> А его вовсе не обязательно определять, т.к. обращений к нему не

ПК>> будет.

К> Не будет обращений — не будет и проверки


Тоже верно.

К> Или я чего-то не догоняю? (тогда примером кинься, пожалуйста).


Лучше использовать какой-нибудь typedef с массивом неправильной длины.
Posted via RSDN NNTP Server 1.5 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[4]: Инстанцирование шаблонов при определенных условиях
От: Дмитро  
Дата: 07.05.03 11:09
Оценка:
Здравствуйте, centurn, Вы писали:

C> Ну, знаешь... "delete забыли сделать" — это тоже глюк, который надо исправлять. Правда, это уже не обнаружить

C>на этапе компиляции...

Да, но это уже другой глюк. А если один глюк (отсутствие вызова delete) скрывает другой (неверные парамеры шаблона), то это совсем плохо.

Д>либо обращение идет к статическим членам данных.


C> Насчет этого я уже говорил.


Я это помню.

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