LINUX.ORG.RU

История изменений

Исправление Kuzy, (текущая версия) :

Т.е. на каждый свой обсёр трепло будет нести херню вида «не меняет»? Как так не меняет, ты балаболил про мало типов, а типов бесконечное кол-во. Ты обделался.
К тому же нести херню о том, что auto чего-то там не меняет. Маня, ты там болтал про про кругозор. Ну вот и почитай букварь. Узнай что такое лямбда, какие у неё свойства, что такое auto и что такое auto = []{}.

Еще раз типов ВНУТРИ темплейтов. typename - это тип внутри языка темплейтов.

Примеры его значений

int
float
S<int, float>
decltype([] {})
std::string
CustomType
Все что ты перечислил это typename.

мп - это мусорное говно из скриптухи. Никакого отношения к теме не имеет. Тебе нужно оправдываться за позор. А так же показывать подобное поведение в динамической типизации, о которой ты балаболил.

Специализация это и есть паттерн матчинг.

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
Все что ты перечислил это typename.

мп - это мусорное говно из скриптухи. Никакого отношения к теме не имеет. Тебе нужно оправдываться за позор. А так же показывать подобное поведение в динамической типизации, о которой ты балаболил.

Специализация это и есть паттерн матчинг.

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.

Можешь начинать рассказывать где тут, опциональный контекст, который можно отключить (и ничего не понять). Что это не стектрейс раскрытия темплейтов. Что половина сообщений это не ошибка (интересно с какой сторы стека начнем сообщения убирать, как «не ошибку»).

Я вообще не понимаю, зачем ты споришь. Концепты ведь ровно это проблему и решают.