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

Обявление шаблонного класса - C++

Войти
Регистрация
Восстановить пароль
 
norge_goth
62 / 62 / 7
Регистрация: 27.01.2009
Сообщений: 279
05.10.2011, 15:42     Обявление шаблонного класса #1
Как-то с пониманием С++ вроде уже все норм, осталась только одна тема немного темная - шаблоны, вроде бы и понимаю как они работают да и штука нужная, но все таки не которые детали синтаксиса и реализации кажутся немного "инопланетянскими", к примеру описание класса сигнала в бусте(boost/signal.hpp)

C++
1
2
3
4
5
6
7
8
9
10
11
12
template<typename Signature,   // Function type R (T1, T2, ..., TN)
         typename Combiner = last_value<R>, 
         typename Group = int, 
         typename GroupCompare = std::less<Group>, 
         typename SlotFunction = functionN<Signature> > 
class signal : public signalN<R, T1, T2, ..., TN, Combiner, Group, GroupCompare, SlotFunction>
{
public:
  // construct/copy/destruct
  signal(const combiner_type& = combiner_type(), 
         const group_compare_type& = group_compare_type());
};
что это за такие параметры у класса ...
C++
1
signalN<R, T1, T2, ..., TN, Combiner, Group, GroupCompare, SlotFunction>
и разве можно так объявлять параметры R, T1, T2, ..., TN через троеточие? как оно работает и что означает? не где такого не видел...

Спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.10.2011, 15:42     Обявление шаблонного класса
Посмотрите здесь:

Объявление шаблонного класса C++
C++ Функция-член шаблонного класса
C++ Создание Шаблонного класса
C++ Инстанцирование шаблонного класса
C++ Определение методов шаблонного класса
C++ Указатель на экземпляр шаблонного класса
Вызов метода у шаблонного поля, шаблонного класса C++
Итератор внутри шаблонного класса C++
Реализация шаблонного класса C++
Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра? C++
Специализация шаблонного класса C++
C++ Чем отличается шаблонный метод класса от шаблонного класса?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5759 / 3408 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
05.10.2011, 15:57     Обявление шаблонного класса #2
Цитата Сообщение от norge_goth Посмотреть сообщение
и разве можно так объявлять параметры R, T1, T2, ..., TN через троеточие? как оно работает и что означает? не где такого не видел...
http://en.wikipedia.org/wiki/Variadic_template
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7955 / 4717 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
05.10.2011, 16:10     Обявление шаблонного класса #3
norge_goth,
Реальное определение на самом деле такое.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
  template<
    typename Signature, // function type R (T1, T2, ..., TN)
    typename Combiner = last_value<typename function_traits<Signature>::result_type>,
    typename Group = int,
    typename GroupCompare = std::less<Group>,
    typename SlotFunction = function<Signature>
  >
  class signal :
    public BOOST_SIGNALS_NAMESPACE::detail::get_signal_impl<Signature,
                                                            Combiner,
                                                            Group,
                                                            GroupCompare,
                                                            SlotFunction>::type
В версии 1.42. Выше посмотреть не могу. Быть может там уже действительно Variadic,

Добавлено через 13 минут
А signalN в свою очередь это

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  // The actual signalN class
  template<
    typename R,
    BOOST_SIGNALS_TEMPLATE_PARMS
    BOOST_SIGNALS_COMMA_IF_NONZERO_ARGS
    typename Combiner = last_value<R>,
    typename Group = int,
    typename GroupCompare = std::less<Group>,
    typename SlotFunction = BOOST_SIGNALS_FUNCTION<
                              R BOOST_SIGNALS_COMMA_IF_NONZERO_ARGS
                              BOOST_SIGNALS_TEMPLATE_ARGS>
  >
  class BOOST_SIGNALS_SIGNAL :
    public BOOST_SIGNALS_NAMESPACE::detail::signal_base, // management of slot list
    public BOOST_SIGNALS_NAMESPACE::trackable // signals are trackable
Где

C++
1
2
3
4
5
6
7
8
9
10
#define BOOST_SIGNALS_NUM_ARGS 10
#define BOOST_SIGNALS_TEMPLATE_PARMS typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10
#define BOOST_SIGNALS_TEMPLATE_ARGS T1, T2, T3, T4, T5, T6, T7, T8, T9, T10
#define BOOST_SIGNALS_PARMS T1 a1, T2 a2, T3 a3, T4 a4, T5 a5, T6 a6, T7 a7, T8 a8, T9 a9, T10 a10
#define BOOST_SIGNALS_ARGS a1, a2, a3, a4, a5, a6, a7, a8, a9, a10
#define BOOST_SIGNALS_BOUND_ARGS args->a1, args->a2, args->a3, args->a4, args->a5, args->a6, args->a7, args->a8, args->a9, args->a10
#define BOOST_SIGNALS_ARGS_AS_MEMBERS T1 a1;T2 a2;T3 a3;T4 a4;T5 a5;T6 a6;T7 a7;T8 a8;T9 a9;T10 a10;
#define BOOST_SIGNALS_COPY_PARMS T1 ia1, T2 ia2, T3 ia3, T4 ia4, T5 ia5, T6 ia6, T7 ia7, T8 ia8, T9 ia9, T10 ia10
#define BOOST_SIGNALS_INIT_ARGS :a1(ia1), a2(ia2), a3(ia3), a4(ia4), a5(ia5), a6(ia6), a7(ia7), a8(ia8), a9(ia9), a10(ia10)
#define BOOST_SIGNALS_ARG_TYPES typedef T1 arg1_type; typedef T2 arg2_type; typedef T3 arg3_type; typedef T4 arg4_type; typedef T5 arg5_type; typedef T6 arg6_type; typedef T7 arg7_type; typedef T8 arg8_type; typedef T9 arg9_type; typedef T10 arg10_type;
В файле singal10.hpp.

И совет. Лучше разбирайся с шаблонами на более простом. А хочется поломать голову - mpl смотри или spirit. Надолго хватит.
Yandex
Объявления
05.10.2011, 16:10     Обявление шаблонного класса
Ответ Создать тему
Опции темы

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