Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> инициализация шаблонного типа 
V
    Опции темы
boostcoder
Дата 10.2.2011, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



всем доброго дня.

пример:
Код

template<typename T>
T func(const T& defval = ???) {
   if ( ... )
      return defval;
   T val(???);
   ...
}

вопрос в том, как инициализировать неизвестный тип?

спасибо.
PM WWW   Вверх
maxim1000
Дата 10.2.2011, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



да так же, как и нешаблонный...
Код

T func(const T& defval = T())



--------------------
qqq
PM WWW   Вверх
boostcoder
Дата 10.2.2011, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



maxim1000, я сделал так же.
но из любопытства задал вопрос, потому что, не уверен был в том, что это корректный вариант для любых типов.
т.е. вне зависимости от типа, конструкция типа "T()" произведет инициализацию типа каким значением? учитывая что тип может быть POD/не_POD ?
PM WWW   Вверх
mes
Дата 10.2.2011, 10:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  10.2.2011,  08:49 Найти цитируемый пост)
 вне зависимости от типа, конструкция типа "T()" произведет инициализацию типа каким значением? 

в зависимости  smile либо вызов конструктора, либо zero-иницоиализация smile


Цитата(boostcoder @  10.2.2011,  08:49 Найти цитируемый пост)
 что это корректный вариант для любых типов.

если у типа нет подходящего конструктора, компилятор завопит smile





--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 10.2.2011, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  10.2.2011,  10:03 Найти цитируемый пост)
либо вызов конструктора, либо zero-иницоиализация

о как!
т.е. POD`ы будут инициализированы нулем, а классы - конструктором по умолчанию, я правильно понял?

PM WWW   Вверх
borisbn
Дата 10.2.2011, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



работает даже если T - функция
Код

template<typename T>
T func( const T & defval = T() ) {
    return defval;
}

void foo()
{
    typedef void (*f_t)();
    f_t f0 = func<f_t>();       // f0 == 0
    f_t f = func<f_t>( foo );
}

только у меня один вопрос ( boostcoder, если не возражаешь ) - смотрю в отладчике (MSVC 2008) значения f и foo
Цитата

f    0x008310b9 foo(void)    void (void)*
*f    0x008310b9 foo(void)    void (void)
foo    0x00831290 foo(void)    void (void)

и они, почему-то, отличаются. Так и должно быть ? Почему ?
Спасибо.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
azesmcar
Дата 10.2.2011, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(boostcoder @  10.2.2011,  10:06 Найти цитируемый пост)
т.е. POD`ы будут инициализированы нулем, а классы - конструктором по умолчанию, я правильно понял?

Это default инициализация.
Цитата

To default-initialize an object of type T means:
— if T is a non-POD class type (clause 9), the default constructor for T is called (and the initialization is
ill-formed if T has no accessible default constructor);
— if T is an array type, each element is default-initialized;
— otherwise, the object is zero-initialized.

а zero инициализация в свою очередь означает
Цитата

To zero-initialize an object of type T means:
— if T is a scalar type (3.9), the object is set to the value of 0 (zero) converted to T;
— if T is a non-union class type, each nonstatic data member and each base-class subobject is zeroinitialized;
— if T is a union type, the object’s first named data member89) is zero-initialized;
— if T is an array type, each element is zero-initialized;
— if T is a reference type, no initialization is performed



Это сообщение отредактировал(а) azesmcar - 10.2.2011, 10:18
PM   Вверх
mes
Дата 10.2.2011, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(azesmcar @  10.2.2011,  09:17 Найти цитируемый пост)
а zero инициализация в свою очередь означает

тогда уж для полноты картины и value-initialize:
Цитата

To value-initialize an object of type T means:
— if T is a class type (clause 9) with a user-declared constructor (12.1), then the default constructor for T is
called (and the initialization is ill-formed if T has no accessible default constructor);
— if T is a non-union class type without a user-declared constructor, then every non-static data member
and base-class component of T is value-initialized;

smile


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 10.2.2011, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



все понял.
вопрос закрыт.

Добавлено @ 10:39
azesmcar, mes, все понял.
и последний вопрос: Вам череп не жмет? smile 


Это сообщение отредактировал(а) boostcoder - 10.2.2011, 10:40
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0559 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.