Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
#1

Шаблоны - вопрос - C++

15.06.2011, 23:03. Просмотров 850. Ответов 19
Метки нет (Все метки)

Добрый вечер. Гуглился в поисках ответа на вопрос - раздельная компилляция шаблонов. объявление в хедер, определение в цпп. У Страустркпа все весело и замечательно, все разделено и определение в цпп предваряется ключевым словом export, которое в студии 2010 - подавлено и зарезервировано, как мне любезно сообщила сама студия. Долго извращался думая, что ж не так, и так определение кртуил и эдак в результате получал то unresolved external то еще ошибки. Все корректно компилится только когда все туловище в хедере. Ну никак не получилось разделить. Подскажите мож у кого есть опыт, ну или успокойте скажите что такое НЕ возможно. Сразу скажу что специализация это не вариант, поскольку шаблон должен работать с любыми объектами. Просто по одной ссылке видел, мол раздельно компилируется если воткнуть в цпп перед определением специализацию. Даже если это работает - это не то. На кой мне, да и вам десятки, сотни и тд специализаций для типов с коими когда либо взбредет работать пользователю. Его объект(если это объект) все равно не угадать. Итак ДА или НЕТ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.06.2011, 23:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шаблоны - вопрос (C++):

Шаблоны. Теоретический вопрос. - C++
Приветствую всех! Суть вопроса в следующем: известно, что для шаблонного класса невозможно разделение вида "описание в хедере, реализация -...

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». - C++
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Есть ли разница в этих понятиях? Если есть, то в чём? И где (в каких...

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

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

шаблоны - C++
возник вопрос, а как можно сделать так, чтобы различные экземпляры шаблона класса вели себя по разному в зависимости от того, что было...

шаблоны - C++
Здравствуйте, а можете подсказать в чем различия между шаблоном функции и шаблонной функцией?

19
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
15.06.2011, 23:16 #2
AzaKendler, Нереально. Только с явным инстанцированием в cpp.
Ну и в новом стандарте таки обещают export шаблонофф
1
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
16.06.2011, 10:08  [ТС] #3
ForEveR, а как можно будет воспользоваться новым стандартом? его будет поддерживать новая студия или на 2010 можно будет накатить апдейт? как это делается обычно?
0
silent_1991
Эксперт С++
4987 / 3044 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
16.06.2011, 13:44 #4
Отказались вроде в последнем варианте стандарта от экспорта шаблонов. Сослались на огромную сложность реализации.
1
asics
Freelance
Эксперт С++
2848 / 1783 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
16.06.2011, 13:49 #5
AzaKendler, Можно скачать компилятор Comeau C++ он, если я не ошибаюсь, поддерживает ключевое слово export.
1
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
19.06.2011, 22:55  [ТС] #6
наваял шаблон типа map - такое было задание, может принимать в качестве ключа все где определен оператор >, <.
А как сравнить инфу по указателям? например char* можно что то вроде strcpy_s, но в то же время может попаст`ся и int* и какой нибудь userdefined*. Мне думается во всех случаях кроме char* их придется разыменовать, но как определить что это именно указатель? каковы критерии.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
20.06.2011, 11:33 #7
AzaKendler, Если в контейнер подается указатель как тип - сравнение тоже идет по указателю соответственно.
0
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
20.06.2011, 12:07  [ТС] #8
ForEveR, просто я не использовал алгоритмы STL и в данном шаблоне сравнение ввиде банальных операций > <. Мне просто даже самому интересно(как например это в алгоритмах работает) как сравнить 2 указателя? ведь сравнивать 2 адреса - это неверно. В данном случае мне видится, 1. необходимо определить что в контейнер попало указатель или нет. Если указатель, то разыменовываем и сравниваем. если нет то просто сравниваем.
контейнер самолепный и нужен лишь для понимания работы контейнеров такого типа. поэтому там все очень примитивно и просто.
и вопрос только в том, как определить указатель данный тип или нет?. Подскажите плиз. Существует ли такой механизм или все решается перегрузками и специализациями?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
20.06.2011, 13:01 #9
AzaKendler,
ведь сравнивать 2 адреса - это неверно.
Вы не правы уже тут. Если ключ указатель - сравниваются именно два адреса. Все таки действует оператор less или другой поданный пользователем предикат. А less<> всего-лишь сравнивает.
На тему определения. boost::type_traits. Скоро будет std::type_traits, полагаю во многих компилях уже есть.

Добавлено через 10 минут
Дабы не быть голословным на тему less.

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
#include <iostream>
#include <map>
#include <algorithm>
#include <iterator>
 
int main()
{
    std::map<int*, int> mp;
    std::vector<int> vec((std::istream_iterator<int>(std::cin)), std::istream_iterator<int>());
    std::vector<int*> pvec(vec.size());
    auto iter = vec.begin();
    std::for_each(pvec.begin(), pvec.end(), [&iter](int*& pointer) {pointer = &(*iter); ++iter;});
    iter = vec.begin();
    auto piter = pvec.begin();
    for(; iter != vec.end(); ++iter, ++piter)
    {
        mp.insert(std::make_pair(*piter, *iter));
    }
    std::for_each(mp.begin(), mp.end(), [](const std::pair<int*, int>& pair) 
            {
                std::cout << "Pointer: " << pair.first << '\n'
                          << "Value: " << pair.second << '\n';
            });
    return 0;
}
Добавлено через 15 минут
Ну и на тему type_traits примерчик.

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
#include <iostream>
#include <type_traits>
 
class check
{
public:
    template<class T>
    bool operator()(const T& value) 
    {
        return std::is_pointer<T>::value;
    }
};
 
int main()
{
    check checker;
    std::cout << std::boolalpha << checker(5) << '\n';
    std::cout << std::boolalpha << checker(25.5) << '\n';
    int variable = 5;
    int* ptr = &variable;
    std::cout << std::boolalpha << checker(ptr) << '\n';
    int** pptr = &ptr;
    std::cout << std::boolalpha << checker(pptr) << '\n';
    std::cout << std::boolalpha << std::is_pod<int>::value << '\n';
}
2
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
20.06.2011, 16:44  [ТС] #10
все воткнул. дереву видимо главное просто иметь принцип больше меньше, а что в основе неважно, оно сможет сбалансироваться. Ну а насчет примеров........просто снимаю шляпу.....читать мне не перечитать еще...Я то STL все на шаблонах мусолю. Даже до алгоритмов не дочитал..

Добавлено через 2 минуты
обзавидуешься уровню. сколькож надо практики, чтоб вот так слету писать.

Добавлено через 3 минуты
если можно [](const std:air<int*, int>& pair - для чего [] - используется?
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.06.2011, 16:47 #11
Цитата Сообщение от AzaKendler Посмотреть сообщение
если можно [](const std:air<int*, int>& pair - для чего [] - используется?
http://habrahabr.ru/blogs/cpp/66021/
1
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
20.06.2011, 16:52 #12
AzaKendler, чтобы указать свободные переменные, которые связываются функцией, и тип связывания (по значению или по ссылке)
1
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
20.06.2011, 19:12  [ТС] #13
Nameless One, а насколько выгодна лямда? вся ее мощь полагается насколько я понял на вычислительную мощь компиллятора. не становится ли код менее читабельным при использовании лямбды, особенно лямбды в лямбде? а что по скорости ее работы, из собственного опыта есть наблюдения? быстрее или медленне инлайн функции или одно и тоже?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
20.06.2011, 19:28 #14
AzaKendler, Она удобна. А код коду рознь. Иногда более читабельна чем пара функторов, а иногда пара функторов могут оказаться выгоднее.
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.06.2011, 19:53 #15
а что по скорости ее работы, из собственного опыта есть наблюдения? быстрее или медленне инлайн функции или одно и тоже?
где-то читал, что лямды при компиляции заменяються функторами, сгенерироваными компилятором
0
20.06.2011, 19:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2011, 19:53
Привет! Вот еще темы с ответами:

Шаблоны C++ - C++
Написал template на С++, но он нифига не компилица, пишет мол типа не могу string в int преобразовать в строчке int out_param = (int)param;...

Шаблоны С++ - C++
Есть функция Merge из алгоритма сортировки слиянием, она объединяет два массива A и B, результат записывает в массив C: template&lt;class T&gt;...

Шаблоны - C++
// ConsoleApplication176.cpp : Defines the entry point for the console application. // template&lt;class type&gt; struct link { type...

Шаблоны - C++
Пусть есть шаблон-структура. template &lt;class Data&gt; struct A { Data p; }; И есть указатели на объекты: A&lt;int&gt; *b; ...


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

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

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