Форум программистов, компьютерный форум CyberForum.ru

Шаблоны C++ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
LittleBuster
5 / 5 / 1
Регистрация: 14.10.2010
Сообщений: 104
14.01.2012, 20:54     Шаблоны C++ #1
Написал template на С++, но он нифига не компилица, пишет мол типа не могу string в int преобразовать в строчке
C++
1
int out_param = (int)param;
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
31
32
33
34
35
36
37
38
39
#include <stdio.h>
#include <conio.h>
#include <string>
using namespace std;
 
template <typename InType> class Shablon1
{
public:
 
    void ShowResult(InType param)
    {
        if (typeid(InType) == typeid(int))
        {
            int out_param = (int)param; 
            out_param += 512;
            printf("%d Число: ", out_param);
        }
 
        if (typeid(InType) == typeid(string))
        {
            string out_param = (string)param;
            out_param += "Привет мир"; 
            printf("%s Строка: ", out_param);
        }
    }
};
 
int main()
{
    setlocale(2, "Russian");
 
    Shablon1<string> MyClass1;
    MyClass1.ShowResult("adasdasd");
 
    Shablon1<int> MyClass2;
    MyClass2.ShowResult(456);
 
    return 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
31
32
33
34
35
36
37
38
39
40
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication2
{
    class Shablon1<InType>
    {
        public void Show(InType param)
        {
            if (param is int)
            {
                int outp = Convert.ToInt32(param);
                Console.WriteLine("Число: " + Convert.ToString(outp));
            }
 
            if (param is string)
            {
                string outp = Convert.ToString(param);
                Console.WriteLine("Строка: " + outp);
            }
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Shablon1<int> sh1 = new Shablon1<int>();
            sh1.Show(12);
 
            Shablon1<string> sh2 = new Shablon1<string>();
            sh2.Show("sdfsdfsdf");
 
            Console.Read();
        }
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.01.2012, 20:54     Шаблоны C++
Посмотрите здесь:

C++ шаблоны в си++
C++ Шаблоны
Шаблоны С++ C++
Шаблоны C++
C++ Шаблоны и т.д.(
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
15.01.2012, 17:20     Шаблоны C++ #2
Строки с 12 по 24 фтопку и марш учить С++!
LittleBuster
5 / 5 / 1
Регистрация: 14.10.2010
Сообщений: 104
15.01.2012, 17:25  [ТС]     Шаблоны C++ #3
Цитата Сообщение от Deviaphan Посмотреть сообщение
Строки с 12 по 24 фтопку и марш учить С++!
Спасибо за помощь, ваш ответ весьма информативен.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
15.01.2012, 17:28     Шаблоны C++ #4
Цитата Сообщение от LittleBuster Посмотреть сообщение
Спасибо за помощь
Пожалуйста! Могу даже объяснить почему их следует удалить! Эти строки противоречат смыслу применения шаблонов.

Добавлено через 30 секунд
Переключение типов и всё такое... Это пережиток Си, в С++ такому коду практически всегда не место.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
15.01.2012, 17:42     Шаблоны C++ #5
LittleBuster, то, что вы пытаетесь сделать достигается простой перегрузкой методов класса.
LittleBuster
5 / 5 / 1
Регистрация: 14.10.2010
Сообщений: 104
15.01.2012, 18:28  [ТС]     Шаблоны C++ #6
Это я понимаю, но я хочу именно таким способом сделать, на шарпе то полчается, почему бы и тут не сделать

Добавлено через 5 минут
Цитата Сообщение от Deviaphan Посмотреть сообщение
Добавлено через 30 секунд
Переключение типов и всё такое... Это пережиток Си, в С++ такому коду практически всегда не место.
ММ понятно, вот оно что

Добавлено через 31 минуту
А как тогда определять какие стандартные функции над типом InType можно использовать если мы заранее не будем знать какой это тип
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
15.01.2012, 18:36     Шаблоны C++ #7
LittleBuster, С++ - статически типизированный язык, и не нужно из него лепить С#, тип в шаблоне будет известен уже на этапе компиляции и нет никакой неоходимости в использовании RTTI. Занялся шаблонами - изучи всё до конца прежде чём городить огород.

Цитата Сообщение от LittleBuster Посмотреть сообщение
А как тогда определять какие стандартные функции над типом InType
можно использовать если мы заранее не будем знать какой это тип
Специализация шаблонов на что?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
15.01.2012, 18:40     Шаблоны C++ #8
есть специализация же

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
31
32
33
34
35
36
#include <cstdio>
#include <string>
using namespace std;
 
template <typename InType> class Shablon1
{
public:
 
        void ShowResult(InType param)
        {
 
        }
};
 
template<> void Shablon1<std::string>::ShowResult(std::string param)
{
   std::cout << param;
}
 
template<> void Shablon1<int>::ShowResult(int param)
{
   std::cout << param;
}
 
int main()
{
        setlocale(2, "Russian");
 
        Shablon1<string> MyClass1;
        MyClass1.ShowResult("adasdasd");
 
        Shablon1<int> MyClass2;
        MyClass2.ShowResult(456);
 
        return 0;
}
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
15.01.2012, 18:41     Шаблоны C++ #9
Цитата Сообщение от LittleBuster Посмотреть сообщение
если мы заранее не будем знать какой это тип
В твоём варианте кода ты заранее задаёшь все используемые типы. Но через шаблоны код выглядит более элегантно.
Нарисую в упрощённом виде, чтобы тебе было над чем подумать:
C++
1
2
3
4
5
6
7
8
9
10
11
template<>
vois Shablon1<int>::Show(int v )
{
    v;
}
 
template<>
void Shablon1<string>( string & s )
{
   s;
}
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
15.01.2012, 18:59     Шаблоны C++ #10
разрешение типов параметризации шаблонов происходит на этапе компиляции, а typeid - средство времени выполнения программы. вот и не выходит.
в куске кода на с# выходит потому, что там используются только средсва времени выполнения программы
LittleBuster
5 / 5 / 1
Регистрация: 14.10.2010
Сообщений: 104
15.01.2012, 19:01  [ТС]     Шаблоны C++ #11
Ого, Deviaphan, alex_x_x, спасибо за наглядные примеры
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
15.01.2012, 19:08     Шаблоны C++ #12
LittleBuster, на самом деле проблема в твоем коде была такая:
C++
1
2
3
4
5
6
                if (typeid(InType) == typeid(string))
                {
                        string out_param = (string)param;
                        out_param += "Привет мир"; 
                        printf("%s Строка: ", out_param);
                }
ты предполагаешь, что этот код будет работать только для std::string, но на самом деле этот код будет генериться и для int, и естесственно выдаст ошибку, но не во время исполнения, а во время компиляции
здесь надо менять идею
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
15.01.2012, 19:18     Шаблоны C++ #13
Цитата Сообщение от alex_x_x Посмотреть сообщение
проблема в твоем коде была такая
Ещё точнее в 14 и 21 строке, где int приводился к строке и строка к int.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2012, 19:30     Шаблоны C++
Еще ссылки по теме:

Шаблоны C++
Шаблоны C++
Шаблоны C++

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
15.01.2012, 19:30     Шаблоны C++ #14
Deviaphan, ну да

можно делать так (но не нужно))

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
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <cstdio>
#include <string>
#include <sstream>
using namespace std;
 
template <typename InType> class Shablon1
{
public:
 
        void ShowResult(InType param)
        {
                stringstream str;
                str << param;
                if (typeid(InType) == typeid(int))
                {
                        int out_param;
                        str >> out_param; 
                        out_param += 512;
                        printf("Число: %d\n", out_param);
                }
 
                if (typeid(InType) == typeid(string))
                {
                        string out_param;
                        str >> out_param;
                        out_param += "Привет мир"; 
                        printf("Строка: %s\n", out_param.c_str());
                }
        }
};
 
int main()
{
        setlocale(2, "Russian");
 
        Shablon1<string> MyClass1;
        MyClass1.ShowResult("adasdasd");
 
        Shablon1<int> MyClass2;
        MyClass2.ShowResult(456);
 
        return 0;
}
Yandex
Объявления
15.01.2012, 19:30     Шаблоны C++
Ответ Создать тему
Опции темы

Текущее время: 05:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru