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

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

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

Шаблоны в C++ C++
Шаблоны C++
Шаблоны. Теоретический вопрос. C++
Шаблоны C++
C++ Шаблоны C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.06.2011, 23:16     Шаблоны - вопрос #2
AzaKendler, Нереально. Только с явным инстанцированием в cpp.
Ну и в новом стандарте таки обещают export шаблонофф
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
16.06.2011, 10:08  [ТС]     Шаблоны - вопрос #3
ForEveR, а как можно будет воспользоваться новым стандартом? его будет поддерживать новая студия или на 2010 можно будет накатить апдейт? как это делается обычно?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.06.2011, 13:44     Шаблоны - вопрос #4
Отказались вроде в последнем варианте стандарта от экспорта шаблонов. Сослались на огромную сложность реализации.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
16.06.2011, 13:49     Шаблоны - вопрос #5
AzaKendler, Можно скачать компилятор Comeau C++ он, если я не ошибаюсь, поддерживает ключевое слово export.
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
19.06.2011, 22:55  [ТС]     Шаблоны - вопрос #6
наваял шаблон типа map - такое было задание, может принимать в качестве ключа все где определен оператор >, <.
А как сравнить инфу по указателям? например char* можно что то вроде strcpy_s, но в то же время может попаст`ся и int* и какой нибудь userdefined*. Мне думается во всех случаях кроме char* их придется разыменовать, но как определить что это именно указатель? каковы критерии.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
20.06.2011, 11:33     Шаблоны - вопрос #7
AzaKendler, Если в контейнер подается указатель как тип - сравнение тоже идет по указателю соответственно.
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
20.06.2011, 12:07  [ТС]     Шаблоны - вопрос #8
ForEveR, просто я не использовал алгоритмы STL и в данном шаблоне сравнение ввиде банальных операций > <. Мне просто даже самому интересно(как например это в алгоритмах работает) как сравнить 2 указателя? ведь сравнивать 2 адреса - это неверно. В данном случае мне видится, 1. необходимо определить что в контейнер попало указатель или нет. Если указатель, то разыменовываем и сравниваем. если нет то просто сравниваем.
контейнер самолепный и нужен лишь для понимания работы контейнеров такого типа. поэтому там все очень примитивно и просто.
и вопрос только в том, как определить указатель данный тип или нет?. Подскажите плиз. Существует ли такой механизм или все решается перегрузками и специализациями?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
 Аватар для 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
Каратель
Эксперт C++
6542 / 3962 / 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
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
20.06.2011, 16:52     Шаблоны - вопрос #12
AzaKendler, чтобы указать свободные переменные, которые связываются функцией, и тип связывания (по значению или по ссылке)
AzaKendler
 Аватар для AzaKendler
214 / 116 / 9
Регистрация: 30.05.2011
Сообщений: 1,772
20.06.2011, 19:12  [ТС]     Шаблоны - вопрос #13
Nameless One, а насколько выгодна лямда? вся ее мощь полагается насколько я понял на вычислительную мощь компиллятора. не становится ли код менее читабельным при использовании лямбды, особенно лямбды в лямбде? а что по скорости ее работы, из собственного опыта есть наблюдения? быстрее или медленне инлайн функции или одно и тоже?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
20.06.2011, 19:28     Шаблоны - вопрос #14
AzaKendler, Она удобна. А код коду рознь. Иногда более читабельна чем пара функторов, а иногда пара функторов могут оказаться выгоднее.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
20.06.2011, 19:53     Шаблоны - вопрос #15
а что по скорости ее работы, из собственного опыта есть наблюдения? быстрее или медленне инлайн функции или одно и тоже?
где-то читал, что лямды при компиляции заменяються функторами, сгенерироваными компилятором
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
20.06.2011, 20:48     Шаблоны - вопрос #16
Цитата Сообщение от Maxwe11 Посмотреть сообщение
де-то читал, что лямды при компиляции заменяються функторами, сгенерироваными компилятором
А по сути это те же яйца, но вид сбоку. Сделаны для удобства. Если бы они работали как вложенные функции из GNU CC (т.е. умели бы обращаться к переменным охватывающей функции), то они бы имели принципиально новую функциональность. А так это не более чем удобная форма записи, не привносящая принципиально новой функциональности

Добавлено через 3 минуты
Цитата Сообщение от Evg Посмотреть сообщение
Если бы они работали как вложенные функции из GNU CC
Однако же за счёт [&] фактически оно начинает работать как чистая вложенная функция. Правда без возможности рекурсивного вызова
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
21.06.2011, 00:27     Шаблоны - вопрос #17
Цитата Сообщение от Evg Посмотреть сообщение
Если бы они работали как вложенные функции из GNU CC (т.е. умели бы обращаться к переменным охватывающей функции), то они бы имели принципиально новую функциональность
было бы вообще классно, если бы была возможность использовать (указатель на) вложенную функцию, которая возвращается другой функцией... Но для этого, как я понял, в языке должен быть GC. Хотя, в принципе, в С оно и не нужно.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 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
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
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++ Шаблоны
C++ Шаблоны C++11

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

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

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