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

Непонятен синтаксис шаблонов из кода boost для вычисления факториала - C++

Восстановить пароль Регистрация
 
cyberk20
0 / 0 / 0
Регистрация: 04.12.2015
Сообщений: 21
25.08.2016, 11:51     Непонятен синтаксис шаблонов из кода boost для вычисления факториала #1
Доброго дня, уважаемые форумчане. Просьба ответить на вопрос в чем смысл дивных конструкций из примера внизу.
http://www.boost.org/doc/libs/1_48_0.../factorial.cpp

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
44
45
/*=============================================================================
    Copyright (c) 2001-2003 Joel de Guzman
 
    Distributed under the Boost Software License, Version 1.0. (See accompanying 
    file LICENSE_1_0.txt or copy at [url]http://www.boost.org/LICENSE_1_0.txt[/url])
==============================================================================*/
#include <vector>
#include <algorithm>
#include <iostream>
#include <boost/phoenix/core.hpp>
#include <boost/phoenix/function.hpp>
 
struct factorial_impl
{
    template <typename Sig>
    struct result; 
    
    template <typename This, typename Arg> // ага вот эти "конструкции"
    struct result<This(Arg)> : result<This(Arg const &)> // o_O
    {};
 
    template <typename This, typename Arg> // и эти
    struct result<This(Arg &)> // 0_O
    {
        typedef Arg type; 
    };
 
    template <typename Arg>
    Arg operator()(Arg n) const
    {
        return (n <= 0) ? 1 : n * this->operator()(n-1);
    }
};
 
 
int
main()
{
    using boost::phoenix::arg_names::arg1;
    boost::phoenix::function<factorial_impl> factorial;
    int i = 4;
    std::cout << factorial(i)() << std::endl;
    std::cout << factorial(arg1)(i) << std::endl;
    return 0;
}
Просьба объяснить что это за шаблонные параметры <This(Arg)>, <This(Arg&)>, <This(const Arg&)> - похоже как если бы в качестве шаблонного параметра передавались бы конструкторы класса This с аргументом Arg, но это для меня выглядит клинопись полная.

Буду благодарен за линк на подробный разбор похожих примеров для новичков.

Спасибо)
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2016, 11:51     Непонятен синтаксис шаблонов из кода boost для вычисления факториала
Посмотрите здесь:

Непонятен синтаксис C++
C++ непонятен кусочек кода
C++ Программа для вычисления факториала
C++ Написать программу для вычисления факториала
Функции для вычисления факториала C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
25.08.2016, 12:40     Непонятен синтаксис шаблонов из кода boost для вычисления факториала #2
Цитата Сообщение от cyberk20 Посмотреть сообщение
Просьба объяснить что это за шаблонные параметры <This(Arg)>, <This(Arg&)>, <This(const Arg&)>
Указатель на функцию принимающую один аргумент типа Arg и возвращающую переменную типа This. Далее аналогично аргумент функции является ссылкой и константной ссылкой.
cyberk20
0 / 0 / 0
Регистрация: 04.12.2015
Сообщений: 21
25.08.2016, 13:26  [ТС]     Непонятен синтаксис шаблонов из кода boost для вычисления факториала #3
Цитата Сообщение от Ilot Посмотреть сообщение
Указатель на функцию принимающую один аргумент типа Arg и возвращающую переменную типа This. Далее аналогично аргумент функции является ссылкой и константной ссылкой.
Это что какая-то сокращенная нотация?
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
25.08.2016, 14:01     Непонятен синтаксис шаблонов из кода boost для вычисления факториала #4
Цитата Сообщение от cyberk20 Посмотреть сообщение
Это что какая-то сокращенная нотация?
Нет. Это имя типа. К примеру вы можете написать:
C++
1
2
typedef int type;
type variable;
Для типа функции это будет выглядеть так:
C++
1
2
typedef int func(float);
func f;
DrOffset
6426 / 3800 / 880
Регистрация: 30.01.2014
Сообщений: 6,594
25.08.2016, 14:05     Непонятен синтаксис шаблонов из кода boost для вычисления факториала #5
Цитата Сообщение от Ilot Посмотреть сообщение
Указатель на функцию
Это не указатель на функцию. А просто - тип "функция".

Цитата Сообщение от cyberk20 Посмотреть сообщение
Это что какая-то сокращенная нотация?
Нет, это просто не указатель.
Т.е. типы void(int) и void(*)(int) - это разные типы.
Разбора этого для новичков, честно говоря, не знаю, но это все общие правила типизации в с++ и они логично выводятся при уверенном ее понимании.
cyberk20
0 / 0 / 0
Регистрация: 04.12.2015
Сообщений: 21
26.08.2016, 02:50  [ТС]     Непонятен синтаксис шаблонов из кода boost для вычисления факториала #6
Цитата Сообщение от DrOffset Посмотреть сообщение
Т.е. типы void(int) и void(*)(int) - это разные типы.
Разбора этого для новичков, честно говоря, не знаю, но это все общие правила типизации в с++ и они логично выводятся при уверенном ее понимании.
Скажите в чем разница между указателем на функцию и просто типом функция? "Тип функция" - это нечто вроде "константный указатель на функцию" ??

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 <iostream>
 
using std::cin;
using std::cout;
using std::endl;
 
template<typename T>
struct S
{};
 
template<typename T, typename U>
struct S<T(U)>
{
   S(T argName(U))
      : fieldName(argName)
   {
   }
 
   void call(U val)
   {
      cout << fieldName(val) << endl;
   }
 
private:
   T (*fieldName)(U);
};
 
int foo(int i)
{
   cout << __FUNCTION__ << " : " << i << endl;
   return i+1;
}
 
int main()
{
   S<int(int)> s(foo);
 
   s.call(100);
 
   string ss; cin >> ss; cout << "\n\tsee ya\n" << endl;
   system("pause");
   return EXIT_SUCCESS;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2016, 09:01     Непонятен синтаксис шаблонов из кода boost для вычисления факториала
Еще ссылки по теме:

Функция для вычисления факториала C++
Написать программу для вычисления факториала числа C++
C++ Написать программу для вычисления двойного факториала числа

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

Или воспользуйтесь поиском по форуму:
DrOffset
6426 / 3800 / 880
Регистрация: 30.01.2014
Сообщений: 6,594
26.08.2016, 09:01     Непонятен синтаксис шаблонов из кода boost для вычисления факториала #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от cyberk20 Посмотреть сообщение
Скажите в чем разница между указателем на функцию и просто типом функция?
Вот допустим есть такая функция
C++
1
void test(int x) {}
Выражение test имеет тип void(int), выражение &test имеет тип void(*)(int). Логика видна?
Тип функции - абстракция. Программист не может создать объект типа "функция" (наряду с ссылками, и void). Хотя сами определения функций можно условно считать такими объектами. Поэтому в выражениях, где требуется объект, тип функции продвигается до указателя. Следовательно, выражения void (*p)(int) = &test; и void (*p)(int) = test; эквивалентны. В языке С++ есть еще один тип, который ведет себя похожим образом - это массив, его объекты можно создавать, но их нельзя непосредственно копировать, в этом случае они также продвигаются до указателя.
Таким образом тип функция может быть применен только для выражений на этапе компиляции, в частности для специализаций и шаблонной дедукции. Можно конечно для этих же целей использовать указатель на функцию, но тип функции позволит получить более общую нотацию для функций-членов и свободных функций (как, например, это сделано в std::function).
Yandex
Объявления
26.08.2016, 09:01     Непонятен синтаксис шаблонов из кода boost для вычисления факториала
Ответ Создать тему

Метки
template
Опции темы

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