История изменений
Исправление Kuzy, (текущая версия) :
Т.е. на каждый свой обсёр трепло будет нести херню вида «не меняет»? Как так не меняет, ты балаболил про мало типов, а типов бесконечное кол-во. Ты обделался.
К тому же нести херню о том, что auto чего-то там не меняет. Маня, ты там болтал про про кругозор. Ну вот и почитай букварь. Узнай что такое лямбда, какие у неё свойства, что такое auto и что такое auto = []{}.
Еще раз типов ВНУТРИ темплейтов. typename - это тип внутри языка темплейтов.
Примеры его значений
int
float
S<int, float>
decltype([] {})
std::string
CustomType
мп - это мусорное говно из скриптухи. Никакого отношения к теме не имеет. Тебе нужно оправдываться за позор. А так же показывать подобное поведение в динамической типизации, о которой ты балаболил.
Специализация это и есть паттерн матчинг.
add1 [] = []
add1 x : xs = (x + 1) : add1 xs
template <typename T>
struct id {
using type = T;
};
template <int V>
struct int_ : id<int_<V>> {};
struct Nil : id<Nil> {};
template <typename H, typename T>
struct S;
template <typename L>
struct add1 {};
template <>
struct add1<Nil> : id<Nil> {};
template <int V, typename Xs>
struct add1<S<int_<V>, Xs>> : id<typename S<int_<V + 1>, add1<Xs>>::type> {};
Очень изящный язык. И нет, я это не запускал. Мне лень ставить metashell.
Позорище, ты даже об этом не знаешь? https://godbolt.org/z/eUdGU_ - сиди над этим каждый раз, когда попытаешься нести херню в интернете. Авось не будешь таким позорищем.
Уау, я сравнил void* с void*. Крутой!
Нет, трепло. Ты что родил? T.f() - это никуда и никогда не разворачивается. А когда оно «разворачивается» - оно генерирует все возможные варианты. Возможные, маня, это не все. Трепло. Опять опозорился.
Пыхти, каким образом твоя херня нелепая следует из моих слов.
Честно говоря, я не очень понял, зачем ты мне пытаешься доказать что T.f() не инстанцируется, при условии что T это шаблонный параметр.
Трепло, это не ответ на мой вопрос.
Это ответ на твой вопрос. Прочитай исходный пост еще раз, я там даже в скобках до этого указал, что я имею ввиду под исполнением. Да, алсо, это и так понятно, если мы говорим про язык темплейтов внутри плюсов.
Тебе нужно однозначно связать поведение и твои потуги. https://godbolt.org/z/gAPsXH - почему есть «стектрейс», а нету шаблонов?
Научись в логику. Из шаблонов следует стектрейс. Из стектрейса шаблоны не следуют. В тысячи языков есть стектрейсы, но нет шаблонов.
Каким образом путь до ошибки является следствием исполнения? Тебе нужно на эту тему пыхтеть. Каждая функция в контексте каждого шаблона уникальная. Точно так же как и метод в рамках неймспейса/класса уникален.
Поэтому ошибка в методе в классе в методе в классе в методе - так и будет описываться. Точно так же как и шаблон.
Кароче. Смотри. Вот тебе питон:
def a0(a, b):
return a + b;
def a1(a, b):
return a0(a, b);
def a2(a, b):
return a1(a, b);
def a3(a, b):
return a2(a, b);
a3("0", 0)
Вот это он высрал как рантайм ошибку типов:
File "main.py", line 12, in a3
return a2(a, b);
File "main.py", line 9, in a2
return a1(a, b);
File "main.py", line 6, in a1
return a0(a, b);
File "main.py", line 3, in a0
return a + b;
TypeError: Can't convert 'int' object to str implicitly
Вот плюсовый код
template <typename A, typename B> auto a0(A a, B b) { return a + b; }
template <typename A, typename B> auto a1(A a, B b) { return a0(a, b); }
template <typename A, typename B> auto a2(A a, B b) { return a1(a, b); }
template <typename A, typename B> auto a3(A a, B b) { return a2(a, b); }
int main() {
a3("0", 0.f);
return 0;
}
Вот ошибка _компиляции_.
prog.cc:4:64: error: invalid operands to binary expression ('const char *' and 'float')
template <typename A, typename B> auto a0(A a, B b) { return a + b; }
~ ^ ~
prog.cc:5:62: note: in instantiation of function template specialization 'a0<const char *, float>' requested here
template <typename A, typename B> auto a1(A a, B b) { return a0(a, b); }
^
prog.cc:6:62: note: in instantiation of function template specialization 'a1<const char *, float>' requested here
template <typename A, typename B> auto a2(A a, B b) { return a1(a, b); }
^
prog.cc:7:62: note: in instantiation of function template specialization 'a2<const char *, float>' requested here
template <typename A, typename B> auto a3(A a, B b) { return a2(a, b); }
^
prog.cc:10:5: note: in instantiation of function template specialization 'a3<const char *, float>' requested here
a3("0", 0.f);
^
1 error generated.
Можешь начинать рассказывать где тут, опциональный контекст, который можно отключить (и ничего не понять). Что это не стектрейс раскрытия темплейтов. Что половина сообщений это не ошибка (интересно с какой сторы стека начнем сообщения убирать, как «не ошибку»).
Я вообще не понимаю, зачем ты споришь. Концепты ведь ровно эту проблему и решают.
Исходная версия Kuzy, :
Т.е. на каждый свой обсёр трепло будет нести херню вида «не меняет»? Как так не меняет, ты балаболил про мало типов, а типов бесконечное кол-во. Ты обделался.
К тому же нести херню о том, что auto чего-то там не меняет. Маня, ты там болтал про про кругозор. Ну вот и почитай букварь. Узнай что такое лямбда, какие у неё свойства, что такое auto и что такое auto = []{}.
Еще раз типов ВНУТРИ темплейтов. typename - это тип внутри языка темплейтов.
Примеры его значений
int
float
S<int, float>
decltype([] {})
std::string
CustomType
мп - это мусорное говно из скриптухи. Никакого отношения к теме не имеет. Тебе нужно оправдываться за позор. А так же показывать подобное поведение в динамической типизации, о которой ты балаболил.
Специализация это и есть паттерн матчинг.
add1 [] = []
add1 x : xs = (x + 1) : add1 xs
template <typename T>
struct id {
using type = T;
};
template <int V>
struct int_ : id<int_<V>> {};
struct Nil : id<Nil> {};
template <typename H, typename T>
struct S;
template <typename L>
struct add1 {};
template <>
struct add1<Nil> : id<Nil> {};
template <int V, typename Xs>
struct add1<S<int_<V>, Xs>> : id<typename S<int_<V + 1>, add1<Xs>>::type> {};
Очень изящный язык. И нет, я это не запускал. Мне лень ставить metashell.
Позорище, ты даже об этом не знаешь? https://godbolt.org/z/eUdGU_ - сиди над этим каждый раз, когда попытаешься нести херню в интернете. Авось не будешь таким позорищем.
Уау, я сравнил void* с void*. Крутой!
Нет, трепло. Ты что родил? T.f() - это никуда и никогда не разворачивается. А когда оно «разворачивается» - оно генерирует все возможные варианты. Возможные, маня, это не все. Трепло. Опять опозорился.
Пыхти, каким образом твоя херня нелепая следует из моих слов.
Честно говоря, я не очень понял, зачем ты мне пытаешься доказать что T.f() не инстанцируется, при условии что T это шаблонный параметр.
Трепло, это не ответ на мой вопрос.
Это ответ на твой вопрос. Прочитай исходный пост еще раз, я там даже в скобках до этого указал, что я имею ввиду под исполнением. Да, алсо, это и так понятно, если мы говорим про язык темплейтов внутри плюсов.
Тебе нужно однозначно связать поведение и твои потуги. https://godbolt.org/z/gAPsXH - почему есть «стектрейс», а нету шаблонов?
Научись в логику. Из шаблонов следует стектрейс. Из стектрейса шаблоны не следуют. В тысячи языков есть стектрейсы, но нет шаблонов.
Каким образом путь до ошибки является следствием исполнения? Тебе нужно на эту тему пыхтеть. Каждая функция в контексте каждого шаблона уникальная. Точно так же как и метод в рамках неймспейса/класса уникален.
Поэтому ошибка в методе в классе в методе в классе в методе - так и будет описываться. Точно так же как и шаблон.
Кароче. Смотри. Вот тебе питон:
def a0(a, b):
return a + b;
def a1(a, b):
return a0(a, b);
def a2(a, b):
return a1(a, b);
def a3(a, b):
return a2(a, b);
a3("0", 0)
Вот это он высрал как рантайм ошибку типов:
File "main.py", line 12, in a3
return a2(a, b);
File "main.py", line 9, in a2
return a1(a, b);
File "main.py", line 6, in a1
return a0(a, b);
File "main.py", line 3, in a0
return a + b;
TypeError: Can't convert 'int' object to str implicitly
Вот плюсовый код
template <typename A, typename B> auto a0(A a, B b) { return a + b; }
template <typename A, typename B> auto a1(A a, B b) { return a0(a, b); }
template <typename A, typename B> auto a2(A a, B b) { return a1(a, b); }
template <typename A, typename B> auto a3(A a, B b) { return a2(a, b); }
int main() {
a3("0", 0.f);
return 0;
}
Вот ошибка _компиляции_.
prog.cc:4:64: error: invalid operands to binary expression ('const char *' and 'float')
template <typename A, typename B> auto a0(A a, B b) { return a + b; }
~ ^ ~
prog.cc:5:62: note: in instantiation of function template specialization 'a0<const char *, float>' requested here
template <typename A, typename B> auto a1(A a, B b) { return a0(a, b); }
^
prog.cc:6:62: note: in instantiation of function template specialization 'a1<const char *, float>' requested here
template <typename A, typename B> auto a2(A a, B b) { return a1(a, b); }
^
prog.cc:7:62: note: in instantiation of function template specialization 'a2<const char *, float>' requested here
template <typename A, typename B> auto a3(A a, B b) { return a2(a, b); }
^
prog.cc:10:5: note: in instantiation of function template specialization 'a3<const char *, float>' requested here
a3("0", 0.f);
^
1 error generated.
Можешь начинать рассказывать где тут, опциональный контекст, который можно отключить (и ничего не понять). Что это не стектрейс раскрытия темплейтов. Что половина сообщений это не ошибка (интересно с какой сторы стека начнем сообщения убирать, как «не ошибку»).
Я вообще не понимаю, зачем ты споришь. Концепты ведь ровно это проблему и решают.