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

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

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

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

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

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

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

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

Шаблоны и т.д.( - C++
Создать 2 шаблонные классы с конструктором инициализации и конструктором копирования. Создать третий класс, наследующий свойства из двух...

Шаблоны - C++
ругается на строку "friend class List<T>;", вот что пишет: 1>c:\users\slava\documents\visual studio...

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

Шаблоны - C++
Есть два класса: #include <iostream> #include <string> #include <valarray> using namespace std; template <class T1, class T2> ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
15.06.2011, 23:16     Шаблоны - вопрос #2
AzaKendler, Нереально. Только с явным инстанцированием в cpp.
Ну и в новом стандарте таки обещают export шаблонофф
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
16.06.2011, 10:08  [ТС]     Шаблоны - вопрос #3
ForEveR, а как можно будет воспользоваться новым стандартом? его будет поддерживать новая студия или на 2010 можно будет накатить апдейт? как это делается обычно?
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
16.06.2011, 13:44     Шаблоны - вопрос #4
Отказались вроде в последнем варианте стандарта от экспорта шаблонов. Сослались на огромную сложность реализации.
asics
Freelance
Эксперт C++
2846 / 1783 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
16.06.2011, 13:49     Шаблоны - вопрос #5
AzaKendler, Можно скачать компилятор Comeau C++ он, если я не ошибаюсь, поддерживает ключевое слово export.
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
19.06.2011, 22:55  [ТС]     Шаблоны - вопрос #6
наваял шаблон типа map - такое было задание, может принимать в качестве ключа все где определен оператор >, <.
А как сравнить инфу по указателям? например char* можно что то вроде strcpy_s, но в то же время может попаст`ся и int* и какой нибудь userdefined*. Мне думается во всех случаях кроме char* их придется разыменовать, но как определить что это именно указатель? каковы критерии.
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
20.06.2011, 11:33     Шаблоны - вопрос #7
AzaKendler, Если в контейнер подается указатель как тип - сравнение тоже идет по указателю соответственно.
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
20.06.2011, 12:07  [ТС]     Шаблоны - вопрос #8
ForEveR, просто я не использовал алгоритмы STL и в данном шаблоне сравнение ввиде банальных операций > <. Мне просто даже самому интересно(как например это в алгоритмах работает) как сравнить 2 указателя? ведь сравнивать 2 адреса - это неверно. В данном случае мне видится, 1. необходимо определить что в контейнер попало указатель или нет. Если указатель, то разыменовываем и сравниваем. если нет то просто сравниваем.
контейнер самолепный и нужен лишь для понимания работы контейнеров такого типа. поэтому там все очень примитивно и просто.
и вопрос только в том, как определить указатель данный тип или нет?. Подскажите плиз. Существует ли такой механизм или все решается перегрузками и специализациями?
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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';
}
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
20.06.2011, 16:44  [ТС]     Шаблоны - вопрос #10
все воткнул. дереву видимо главное просто иметь принцип больше меньше, а что в основе неважно, оно сможет сбалансироваться. Ну а насчет примеров........просто снимаю шляпу.....читать мне не перечитать еще...Я то STL все на шаблонах мусолю. Даже до алгоритмов не дочитал..

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

Добавлено через 3 минуты
если можно [](const std:air<int*, int>& pair - для чего [] - используется?
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 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/
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
20.06.2011, 16:52     Шаблоны - вопрос #12
AzaKendler, чтобы указать свободные переменные, которые связываются функцией, и тип связывания (по значению или по ссылке)
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
20.06.2011, 19:12  [ТС]     Шаблоны - вопрос #13
Nameless One, а насколько выгодна лямда? вся ее мощь полагается насколько я понял на вычислительную мощь компиллятора. не становится ли код менее читабельным при использовании лямбды, особенно лямбды в лямбде? а что по скорости ее работы, из собственного опыта есть наблюдения? быстрее или медленне инлайн функции или одно и тоже?
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
20.06.2011, 19:28     Шаблоны - вопрос #14
AzaKendler, Она удобна. А код коду рознь. Иногда более читабельна чем пара функторов, а иногда пара функторов могут оказаться выгоднее.
Jupiter
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.06.2011, 19:53     Шаблоны - вопрос #15
а что по скорости ее работы, из собственного опыта есть наблюдения? быстрее или медленне инлайн функции или одно и тоже?
где-то читал, что лямды при компиляции заменяються функторами, сгенерироваными компилятором
Evg
Эксперт CАвтор FAQ
17464 / 5702 / 361
Регистрация: 30.03.2009
Сообщений: 15,654
Записей в блоге: 26
20.06.2011, 20:48     Шаблоны - вопрос #16
Цитата Сообщение от Maxwe11 Посмотреть сообщение
де-то читал, что лямды при компиляции заменяються функторами, сгенерироваными компилятором
А по сути это те же яйца, но вид сбоку. Сделаны для удобства. Если бы они работали как вложенные функции из GNU CC (т.е. умели бы обращаться к переменным охватывающей функции), то они бы имели принципиально новую функциональность. А так это не более чем удобная форма записи, не привносящая принципиально новой функциональности

Добавлено через 3 минуты
Цитата Сообщение от Evg Посмотреть сообщение
Если бы они работали как вложенные функции из GNU CC
Однако же за счёт [&] фактически оно начинает работать как чистая вложенная функция. Правда без возможности рекурсивного вызова
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
21.06.2011, 00:27     Шаблоны - вопрос #17
Цитата Сообщение от Evg Посмотреть сообщение
Если бы они работали как вложенные функции из GNU CC (т.е. умели бы обращаться к переменным охватывающей функции), то они бы имели принципиально новую функциональность
было бы вообще классно, если бы была возможность использовать (указатель на) вложенную функцию, которая возвращается другой функцией... Но для этого, как я понял, в языке должен быть GC. Хотя, в принципе, в С оно и не нужно.
Evg
Эксперт CАвтор FAQ
17464 / 5702 / 361
Регистрация: 30.03.2009
Сообщений: 15,654
Записей в блоге: 26
21.06.2011, 11:47     Шаблоны - вопрос #18
Цитата Сообщение от Nameless One Посмотреть сообщение
было бы вообще классно, если бы была возможность использовать (указатель на) вложенную функцию, которая возвращается другой функцией... Но для этого, как я понял, в языке должен быть GC. Хотя, в принципе, в С оно и не нужно.
При этом в GNU CC такой указатель является валидным только в тот момент, когда активна охватывающая функция.

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
int (*fptr)(int);
 
void func1 (void)
{
  int x;
 
  /* Физически вложенная функция func2 может работать только в тот момент,
   * пока исполнение находится внутри func1 (или функций, вызванных из func1).
   * Потому как в противном случае обращение к переменной x не имеет смысла,
   * если её уже не существует */
  int func2 (int y)
  {
    return y + x;
  }
 
  fptr = func2;
 
  func3 ();
}
 
void func3 (void)
{
  /* Здесь мы можем использовать указатель на функцию func2, потому как func1
   * ещё не завершилась */
  fptr (1);
}
 
void trampampam (void)
{
  func1();
 
  /* А здесь использовать указатель на функцию func2 мы не имеем права,
   * потому как функция func1 уже завершила свою работу */
  fptr (1);
}
Добавлено через 5 минут
Дополнительно есть ещё вот какой момент. В точке взятия адреса на вложенную функцию в результирующий указатель на функцию как бы ещё и записывается dynamic chain. Т.е. некая информация об активации стека, чтобы при обращении к локалам охватывающей функции доставались именно те значения, которые находятся в стеке вызова в тот момент, когда брался адрес. Криично для рекурсивных вызовов: мы мжем вызвать func1, далее куда-то отдать указатель на func2, далее как-то опять рекурсивно попасть в func1 и опять взять указатель на func2. Так вот два разных вызова по указаетелю func2 при обращении к переменной x будут обращаться к разным активациям стека func1
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
21.06.2011, 12:40     Шаблоны - вопрос #19
Цитата Сообщение от Evg Посмотреть сообщение
При этом в GNU CC такой указатель является валидным только в тот момент, когда активна охватывающая функция.
Что-то такое я и имел в виду
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2011, 13:59     Шаблоны - вопрос
Еще ссылки по теме:

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

шаблоны в си++ - C++
кто может сказать где прблема? List.h #ifndef LIST_H #define LIST_H #include&lt;iostream&gt; #include&lt;ostream&gt; ...

Шаблоны - C++
Я разбираюсь с ООП в С++ и застрял на шаблонах, будьте добры приведите пример кода, к примеру там.... вес машины и шаблон,(ну вообщем на...

Шаблоны С++ - C++
template &lt;typename T_sizeCapacity&gt; class SomeClass { public: T_sizeCacity size; }; Как сделать чтобы T_sizeCapacity мог быть...


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

Или воспользуйтесь поиском по форуму:
AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
21.06.2011, 13:59  [ТС]     Шаблоны - вопрос #20
нынче попробовал лямбду в левых и правых поворотах дерева. знатно. удобно сохранить тельце в переменной и потом пользовать. просто удобно. по остальным показателям не берусь судить
Yandex
Объявления
21.06.2011, 13:59     Шаблоны - вопрос
Ответ Создать тему
Опции темы

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