Igor
If B is true, std::enable_if has a public member typedef type, equal to T; otherwise, there is no member typedef.
т.е. если условие выполняется, то в struct enable_if есть тайпдеф на живой и здоровый тип, если не выполняется - то тайпдеф происходит на какую-то хрень, которой быть не может, продолжение вывода или ошибка компиляции, если продолжать некуда
Aidar
Только енейбл иф это не всегда сфинае
Anatoly
If B is true, std::enable_if has a public member typedef type, equal to T; otherwise, there is no member typedef.
т.е. если условие выполняется, то в struct enable_if есть тайпдеф на живой и здоровый тип, если не выполняется - то тайпдеф происходит на какую-то хрень, которой быть не может, продолжение вывода или ошибка компиляции, если продолжать некуда
enable_if - это просто штука, которая выдает ошибку компиляции, как например 1/0
а SFINAE включается при подстановке параметра шаблона. Нету параметра шаблона - нету sfinae.
Anatoly
Поэтому нужен исскуственный параметр шаблона, ибо без него SFINAE не будет, будет просто ошибка компиляции
Constantine
если без много букав, то SFINAE касается только S
Igor
кхм
т.е. если мы вешаем enable_if на не-шаблонный метод шаблонного класса template<typename T> class Something, то SFINAE не сработает потому что на момент "обработки" метода тип уже подставлен?
Constantine
enable_if_t<...> это typename enable_if<...>::type
так что enable_if_t<false> это ill-formed
Constantine
enable_if<false> не содержит type
Igor
дошло, спасибо
Berkus
Igor
нет стоп, не дошло 9_6
Constantine
Constantine
enable_if_t<false> f() это все еще ошибка компиляции
Igor
одну минуту, ещё раз обдумаю
Constantine
SFINAE говорит, что если синтез декларации чего-то шаблонного не удался с текущими параметрами подстановки, надо сделать вид, что ничего не произошло и этого чего-то шаблонного просто и нет
Constantine
template <bool Condition>
struct some {
enable_if_t<Condition> foo() { //ошибка компиляции, не было шаблонной подстановки
}
};
Igor
всё, уяснил, и эхом что-то из Майерса вспомнилось даже на эту тему
большое спасибо
Constantine
struct some2 {
template <typename T>
enable_if_t<!std::is_same_v<T, void>> foo(std::plus<T>) { //эту функцию просто не надо инстанцировать для plus<void>
}
};
Дмитрий ⬡
Чат, как это вообще парсится? https://goo.gl/pNPy7s
Berkus
Igor
—context-dependant keyword во всей красе, насколько я могу судить— вру, auto к ним не относится, только override / final
Vladislav
ехал auto через auto
видит auto - в реке auto
сунул auto auto в auto
auto auto auto auto
Constantine
забавно, а using auto = decltype(auto()); нельзя
Constantine
прямо вопрос на идиотское собеседование
Vladislav
чего это нельзя? https://godbolt.org/g/XrSem7
Vladislav
(а я уж думал что нашелся еще пример различия using и typedef кроме шаблонных биндингов)
Oleg
Constantine
хм
Constantine
Constantine
Ostap ꑭ
Constantine
constexpr auto auto = auto<auto,auto,auto,auto,auto,auto>();
constexpr auto auto = auto<auto,auto,auto,auto,auto,auto,auto>();
я ниасиливаю вот этот фрагмент
Constantine
почему здесь не происходит дублирование
Oleg
И почему в следующей строчке (auto*auto) эти auto берутся в правильном порядке. Я вот вообще что-то не знаю, что означает auto в качестве имени переменной.
Anatoly
короч это фейк
Oleg
Там поддельные auto, точно.
Vladislav
юникод?
Anatoly
>>> '''
constexpr auto auto()
'''.encode()
b'\nconstexpr auto auto\xe2\x80\x8b()\n'
Oleg
Ага, что-то вроде Zero-Width-Joiner к ним приписано.
Anatoly
угу
Constantine
читеры
Anonymous
хелло
Constantine
\u{200b}
Constantine
zero-width space
Anonymous
как топ элемент в стэке получить через функцию, не используя библиотеку?
Anonymous
что-то в голову ничего не приходит
Constantine
вот в 6 осле я бы сразу заметил, потому что он в моноширинных шрифтах zero width символы показывал в полную ширину при выделении
Berkus
Anonymous
top элемент как получить в стэке?
Anatoly
в каком стэке?
Anonymous
есть библиотека stack и через ее это очень просто делается
Anatoly
где там?
Anonymous
их бывает миллион?
Anonymous
)
Berkus
Anonymous
да
Anonymous
но
Anatoly
Anonymous
void Stack::pop()
{
if (!isEmpty()) { length--; }
else
cout « "стэк пуст" « endl;
Anonymous
это для pop
Anatoly
@supapro
Anonymous
@supapro
Igor
и @нет_наркотикам заодно
Anonymous
понял
Anonymous
спс
Anatoly
почему тот чат называется "supapro"?
Anatoly
Constantine
ох уж эти плюсы
https://godbolt.org/g/dBTtmF
Constantine
g + g будет ошибкой компиляции
Constantine
я пытаюсь построить пример, когда g + g будет синтаксически корректным и g будет обозначать разное
Vladislav
Alexander "SonnySlave"
Alexander "SonnySlave"
можно сделать ещё через макросы
Constantine
ээээээ щито
Vladislav
хитрееец
сорри, не удержался 😊
Constantine
а
Constantine
понапробелили
Constantine
> struct X {} g
а я думал этот синтаксис MS расширение