Re[5]: Как написать Any с uniform initialization
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 29.11.19 13:14
Оценка: :)
Здравствуйте, rg45, Вы писали:

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


M>>>конструктор Any{int} и Any{Any &&} работает совершенно по-разному в моём коде. разве что шаблонный класс-хелпер-инициализатор со специализациями сделать вместо конструктора — и передавать из универсального шаблонного конструктора в него — но это сложно и поэтому убого выглядит

K>>Ну так перегрузи его
K>>
K>>  template<class T>
K>>    Any(std::initializer_list<T>&&) { std::cout<<"foo"<<std::endl;  }
K>>

K>>и в мейн
K>>
K>>  Any a{10};
K>>

K>>делай везде префект порвардинг и не будет лишних копирований.

R>Настало время вредных советов? Бездумное применение perfect forwarding — это современный изощренный способ стрельбы по собственным конечностям, а тем более, если ВЕЗДЕ.

Ну.. дай свой, лол.

R>И кстати, в твоем примере это никакой не perfect forwarding, а просто rvalue ссылка на объект initializer_list.

Согласен, да.
R>Который, даже сам являясь времменным объектом, предоставляет доступ к своим элементам исключительно по константным lvalue ссылкам. Поэтому перемешение содержимого initializer_list невозможно в принципе. Пруф здесь.
Ну ок.
Sic luceat lux!
Re[3]: Как написать Any с uniform initialization
От: swingus  
Дата: 30.11.19 19:47
Оценка: +1
Для архаичных компиляторов есть архаичное стандартное решение:


template <typename Tn> 
Any( Tn &&, std::enable_if_t<!std::is_convertible_v<Tn, Any>, enabler> = enabler{} ) {printf("\ntemplate");}




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

NB>может не сработать на старых реализациях, т.к. неиспользуемые шаблонные параметры с дефолтным значением в старых версиях стандарта в SFINAE не участвуют.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.