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

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

Войти
Регистрация
Восстановить пароль
 
cyberk20
0 / 0 / 0
Регистрация: 04.12.2015
Сообщений: 21
#1

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

25.08.2016, 11:51. Просмотров 224. Ответов 6

Доброго дня, уважаемые форумчане. Просьба ответить на вопрос в чем смысл дивных конструкций из примера внизу.
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, но это для меня выглядит клинопись полная.

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

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

Непонятен синтаксис - C++
Доброго времени суток! Хотелось бы попросить вашего совета. код double **E = new double *; в данном отрывке...

Программа для вычисления факториала - C++
Зравствуйте, помогите, пожалуйста, написать программу, которая вычисляет факториал введенного с клавиатуры положительного числа. Программа...

Функции для вычисления факториала - C++
Составить программу для вычисления факториала числа. Найдите факториали 4, 7, 10.

Функция для вычисления факториала - C++
определить функцию вычисления факториала числа. Рассчитать с помощью нее: 2x5! + 3x9! \ 7! +10! помогите пожалуйста с программой в С++ ...

Написать программу для вычисления факториала - C++
Помогите! заранее спасибо!

Написать программу для вычисления факториала числа - C++
1) написать программу для вычисления факториала числа n!=1*2*3...*n. Число n вводится с клавиатуры

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

Цитата Сообщение от cyberk20 Посмотреть сообщение
Это что какая-то сокращенная нотация?
Нет, это просто не указатель.
Т.е. типы void(int) и void(*)(int) - это разные типы.
Разбора этого для новичков, честно говоря, не знаю, но это все общие правила типизации в с++ и они логично выводятся при уверенном ее понимании.
1
cyberk20
0 / 0 / 0
Регистрация: 04.12.2015
Сообщений: 21
26.08.2016, 02:50  [ТС] #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;
}
0
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
26.08.2016, 09:01 #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).
2
26.08.2016, 09:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2016, 09:01
Привет! Вот еще темы с ответами:

непонятен кусочек кода - C++
Вот функция равномерного распределинея чисел. int x1=time(NULL)*16331; int rand_d(int t) { float r; int da=0, db=t, m=97,...

Написать программу для вычисления двойного факториала числа - C++
2) написать программу для вычисления двойного факториала числа n!!=n*(n-2)*(n-4)*(n-6)... Число n вводится с клавиатуры.

Написать программу для вычисления факториала числа с заданной точностью - C++
Написать программу для вычисления факториала числа: n!=1*2*3*.....n. Использовать специальный класс, полем которого является число n, а...

С++ Найти m! + (m+n)!, создав процедуру для вычисления факториала произвольного натурального числа - C++
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; void my_fact(int m, int n) { if (n == 0) my_fact=1; ...


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

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

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