Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 14.02.2015
Сообщений: 31
1

Шаблоны

25.03.2015, 20:44. Показов 682. Ответов 16
Метки нет (Все метки)

На сколько я знаю, в с++ нельзя указать типу шаблона что то вроде: <T extends MyClass>
Поэтому такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class A
{
    public:
        void f() {}
};
 
template<typename T>
void t(T t)
{
    t.f();
}
int main()
{
    A a;
    t(a);
 
    return 0;
}
Могу ли я назвать это утиной static типизацией? Или меня закидают помидорами?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.03.2015, 20:44
Ответы с готовыми решениями:

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами».
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Есть ли разница в этих понятиях? Если...

Шаблоны. Плохо понимаемые моменты из книги "Шаблоны С++. Справочник разработчика". (Вандевурд, Джосаттис)
Так как изучаю эту книгу, то в некоторых местах возникают вопросы. Чтобы не плодить много тем,...

Помогите писать на С++ через шаблоны. Консуле я писал, но надо писать исползуя шаблоны
В одномерном массиве, состоящем из п вещественных элементов, вычислить: 1) количество элементов...

Шаблоны
template &lt;typename Type&gt; bool Func(Type &amp;data) { } Как сделать, что бы шаблон работал...

16
Эксперт С++
8556 / 4132 / 908
Регистрация: 15.11.2014
Сообщений: 9,330
25.03.2015, 21:09 2
Цитата Сообщение от newbew Посмотреть сообщение
На сколько я знаю, в с++ нельзя указать типу шаблона что то вроде: <T extends MyClass>
WTF ?

Цитата Сообщение от newbew Посмотреть сообщение
Могу ли я назвать это утиной static типизацией?
да

Цитата Сообщение от newbew Посмотреть сообщение
Или меня закидают помидорами?
C++
1
2
3
4
5
template<typename T>
void t(T t) //<--- по значению
{
    t.f(); //<--- копия
}
вы уверены, что хотите воздействовать именно на копию аргумента, а не на оригинальный объект?
0
0 / 0 / 0
Регистрация: 14.02.2015
Сообщений: 31
25.03.2015, 21:19  [ТС] 3
На счет передачи по значению, это в качестве примера не особо задумываясь написал.
На счет "WTF" - кофе пьете?

А вообще, чем же такой способ скресткрест лучше чем в java?
0
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
25.03.2015, 21:20 4
Цитата Сообщение от newbew Посмотреть сообщение
На сколько я знаю, в с++ нельзя указать типу шаблона что то вроде: <T extends MyClass>
что это значит объясните на русском?

Не по теме:

попробую предположить Вы не о таком думали?

C++
1
2
3
4
5
template<typename T>
class MyClass: public T
{
//
}

0
41 / 41 / 26
Регистрация: 24.02.2015
Сообщений: 151
25.03.2015, 21:22 5
aLarman, не, Т должен быть наследником MyClass, очевидно же
0
653 / 574 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
25.03.2015, 21:26 6
ну чет непонятно чего Вы желаете добиться
насчет понятия "static типизация", так она же на этапе сборки, собсно логично что в с++ она вся статичная
0
0 / 0 / 0
Регистрация: 14.02.2015
Сообщений: 31
25.03.2015, 21:46  [ТС] 7
aLarman, мой второй вопрос про плюсы и минусы реализации этой фитчи в разных языках, я выше написал.
Можете объяснить?

Добавлено через 9999999999999 минут
(я про типизацию шаблона)
0
Эксперт С++
4974 / 3082 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
25.03.2015, 21:59 8
Цитата Сообщение от MakeEasy Посмотреть сообщение
aLarman, не, Т должен быть наследником MyClass, очевидно же
Элементарно.
C++
1
2
3
4
5
template<typename MyClass>
class T : public MyClass
{
    // ...
}
newbew, раз уж ты создал эту тему, так будь любезен, объясни что означает эта запись: <T extends MyClass>
А именно, слово extends.
0
0 / 0 / 0
Регистрация: 14.02.2015
Сообщений: 31
25.03.2015, 22:02  [ТС] 9
Из java, означает что переданный шаблон тип должен наследоваться от MyClass.
0
Эксперт С++
8289 / 6120 / 613
Регистрация: 10.12.2010
Сообщений: 28,611
Записей в блоге: 30
25.03.2015, 22:10 10
Цитата Сообщение от newbew Посмотреть сообщение
Из java, означает что переданный шаблон тип должен наследоваться от MyClass.
В С++ можно делать проверки "внутри" через "всякие" type_traits/is_base_of но "естественных" ограничителей нет.
1
Эксперт С++
4974 / 3082 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
25.03.2015, 22:18 11
Цитата Сообщение от newbew Посмотреть сообщение
Из java, означает что переданный шаблон тип должен наследоваться от MyClass.
Я в небольшом замешательстве... Переданный в шаблон чего? Класса, метода, функции?

Добавлено через -1 минуту
Покажи простой пример на Java.
0
Эксперт С++
8289 / 6120 / 613
Регистрация: 10.12.2010
Сообщений: 28,611
Записей в блоге: 30
25.03.2015, 22:29 12
Цитата Сообщение от newbew Посмотреть сообщение
Из java, означает что переданный шаблон тип должен наследоваться от MyClass.
Вероятно передаваемый в шаблон...
0
0 / 0 / 0
Регистрация: 14.02.2015
Сообщений: 31
25.03.2015, 22:39  [ТС] 13
Спасибо, я все понял.
0
Эксперт С++
8556 / 4132 / 908
Регистрация: 15.11.2014
Сообщений: 9,330
25.03.2015, 22:41 14
Цитата Сообщение от newbew Посмотреть сообщение
Я правильно понял?
не правильно.
вы можете построить контейнер,
который ещё в статике забракуют любые типы,
которые не были унаследованы от MyClass.
0
castaway
25.03.2015, 22:47
  #15

Не по теме:

Цитата Сообщение от newbew Посмотреть сообщение
Спасибо, я все понял.
Да ни хрена ты не понял...

0
newbew
25.03.2015, 22:49  [ТС]
  #16

Не по теме:

И что же я не понял? ;c

0
Эксперт С++
8289 / 6120 / 613
Регистрация: 10.12.2010
Сообщений: 28,611
Записей в блоге: 30
26.03.2015, 20:57 17
Цитата Сообщение от hoggy Посмотреть сообщение
не правильно.
Вероятно понял что нельзя сделать так как просто как в java.

Добавлено через 6 минут
Цитата Сообщение от Avazart Посмотреть сообщение
В С++ можно делать проверки "внутри" через "всякие" type_traits/is_base_of но "естественных" ограничителей нет.
Что касается реализации подобных проверок можно посмотреть в Александреску "Современное проектирование на С++"

Добавлено через 22 часа 0 минут
Можно как то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    #include <iostream>
    #include <type_traits>
    using namespace std;
     
    class A{};
    class B:public A {};
     
    template <bool Inherited>
    class Checker; // error, not implemented if not inherited
     
    template<>
    class Checker<true> { /* empty*/ };
     
     
    template <typename T>
    class Test
    {
    private:
    //Checker< std::is_base_of<A,T>::value > check;
    // or use static_assert
    static_assert(std::is_base_of<A,T>::value,"Type T must inherit from A");
    };
     
    int main()
    {
     
    Test<B> test1;
    Test<int> test2; // Error!
    return 0;
    }


http://ideone.com/qw0YxC
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.03.2015, 20:57

Шаблоны
Выполнить задание без использования библиотеки стандартных шаблонов. а) Создать шаблонную функцию...

Шаблоны
ругается на строку &quot;friend class List&lt;T&gt;;&quot;, вот что пишет: 1&gt;c:\users\slava\documents\visual...

Шаблоны в C++
Доброго времени суток! Начал разбираться что такое шаблон и с чем его едят. Загуглил, вставил...

Шаблоны C++11
#include &lt;iostream&gt; template&lt;typename T1, typename T2&gt; auto func(T1 a, T2 b) -&gt;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.