LINUX.ORG.RU

Template specialization

 


1

1

помогите разобраться, правильно ли написано

template <typename T>
typename std::enable_if<!std::is_pointer<T>::value, T&>::type ZeroInit(T& data) 
{ 
	memset(&data, 0, sizeof(T)); 
	return data;
}

template <typename T>
T* ZeroInit(T* data) 
{ 
	memset(data, 0, sizeof(T)); 
	return data;
}


+1 к юнит тесту. Ты же знаешь, чего ты хочешь? :)

Shadow1251
()
  1. Почему ограничение на указатели?
  2. Если T не тривиально копируем, то UB. Надо добавить проверку std::is_trivially_copyable.
Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

А, упустил вторую функцию. Тут enable_if вообще не нужен, потому что T* ZeroInit(T* data) более специализирована, чем T& ZeroInit(T& data).

Begemoth ★★★★★
()
Последнее исправление: Begemoth (всего исправлений: 1)
Ответ на: правильно ли написано от anonymous

смотря чего ты пытаешься добиться

обнуление структур в которых для работы достаточно заполнить гораздо меньше полей, чем есть (а остальные должны быть в 0)

Uter
() автор топика
Ответ на: комментарий от Uter

Чем такой вариант не устраивает?

struct Foo
{
  int a;
  int b = 0;
  int c = 0;
  int d = 0;
};

auto foo = Foo { 42 };
Begemoth ★★★★★
()
Последнее исправление: Begemoth (всего исправлений: 1)
Ответ на: комментарий от Uter

стандарт? с++ template metaprogramming абрахама? у саттера тоже вроде было.

если грубо, то ссылки в крестах живут на таких же правах что и модификаторы типов.

anonymous
()
Ответ на: комментарий от Uter

всё равно не доходит. что такое обнуление типа Т? результат работы конструктора по умолчанию? он у тебя уже есть.

ты хочешь чего-то странного.

anonymous
()
Ответ на: комментарий от Uter

Строгое определение - параграфы 14.5.6.2 и 14.8.2.4 стандарта. Ещё можно почитать C++ Templates: The Complete Guide Вандевурда.

Begemoth ★★★★★
()
Последнее исправление: Begemoth (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.