Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
1401 / 643 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
1

Passing member functions into templates

17.10.2015, 18:35. Просмотров 419. Ответов 12
Метки нет (Все метки)

Привет.

Вот так передаю member-function в шаблон:
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
#include <iostream>
#include <typeinfo>
 
template<typename T, typename U>
void Print(T& object, U u)
{
    std::cout << typeid(object).name() << std::endl
        << typeid(u).name() << std::endl;
}
 
 
class Sample
{
public:
    void Function()
    {
 
    }
};
 
 
int main()
{
    Sample s;
    Print(s, &Sample::Function);
}
Вопрос: можно обойтись функцией Print с одним аргументом? Почему не получается использовать просто
C++
1
2
3
template<typename T>
void Print(T object)
{...}
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.10.2015, 18:35
Ответы с готовыми решениями:

Create a programm that creates an object of created class Time and tests the member functions of class
Time Class Create a class called Time that might be used to represent time. 1. Your...

Templates and pointers to functions
в общем пишу одну процедурку для работы с текстовыми файлами, которая сама должна в вызывать...

Invalid use of member in static member function
Здравствуйте! У меня есть класс: class foo{ public: foo(); ~foo(); int m_number;

Passing const as argument of
В очередной раз qt подкидывает мне проблему. Есть функция float MyPolygon::GetDepth() { ...

12
Эксперт С++
4962 / 3068 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
17.10.2015, 18:46 2
Так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <typeinfo>
 
template <typename T>
void Print( T object )
{
    std::cout << typeid( object ).name() << std::endl
              << typeid( decltype( object )::Function ).name() << std::endl;
}
 
class Sample {
public:
    void Function() {}
};
 
int main()
{
    Sample s;
    Print( s );
}
0
1401 / 643 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
17.10.2015, 18:49  [ТС] 3
castaway, MSVC 2015
Project.cpp(8): error C3867: 'Sample::Function': non-standard syntax; use '&' to create a pointer to member
1> Project.cpp(19): note: see reference to function template instantiation 'void Print<Sample>(T)' being compiled
1> with
1> [
1> T=Sample
1> ]
0
Эксперт С++
4962 / 3068 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
17.10.2015, 18:50 4
Dani, не пользуюсь VS. Попробуй добавить амперсанд:
C++
1
2
    std::cout << typeid( object ).name() << std::endl
              << typeid( &decltype( object )::Function ).name() << std::endl;
1
1401 / 643 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
17.10.2015, 18:52  [ТС] 5
Все заработало.
А почему оно не хочет работать просто с
C++
1
2
3
4
5
template<typename T>
void Print(T obj)
{
...
}
?
0
Эксперт С++
4962 / 3068 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
17.10.2015, 18:55 6
Цитата Сообщение от Dani Посмотреть сообщение
А почему оно не хочет работать просто с
В смысле? Мой пример по-моему так и работает.
0
1401 / 643 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
17.10.2015, 18:55  [ТС] 7
Секунду. Оно делает не то, что я хотел.
Мне нужно передать member-function так, чтобы ее можно было потом вызвать просто func() изнутри шаблона. Не сам объект, а именно функцию.
0
Эксперт С++
4962 / 3068 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
17.10.2015, 18:58 8
Цитата Сообщение от Dani Посмотреть сообщение
Мне нужно передать member-function так, чтобы ее можно было потом вызвать просто func() изнутри шаблона. Не сам объект, а именно функцию.
Нельзя вызвать не статический метод без объекта.
1
1401 / 643 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
17.10.2015, 18:59  [ТС] 9
Имею ввиду что-то вроде
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <typeinfo>
 
template <typename T>
void Print(T object)
{
    object();
}
 
class Sample {
public:
    void Function() {}
};
 
int main()
{
    Sample s;
    Print(s.Function);
}
0
Эксперт С++
4962 / 3068 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
17.10.2015, 19:00 10
Цитата Сообщение от Dani Посмотреть сообщение
Имею ввиду что-то вроде
Боюсь не получится, т.к.
Цитата Сообщение от castaway Посмотреть сообщение
Нельзя вызвать не статический метод без объекта.
Если ошибаюсь - поправьте коллеги.
0
1401 / 643 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
17.10.2015, 19:07  [ТС] 11
Так вроде же объект есть. Что я не понимаю?
У Страуструпа написано:
A compiler can deduce a type template argument, T or TT, and a non-type template argument, I, from a template function argument with a type composed of the following constructs: ... T (type::*)(args)
Т.е. шаблон может разобрать такую функцию, но ее не получится вызвать
0
Эксперт С++
4962 / 3068 / 456
Регистрация: 10.11.2010
Сообщений: 11,159
Записей в блоге: 10
17.10.2015, 19:08 12
Цитата Сообщение от Dani Посмотреть сообщение
Так вроде же объект есть. Что я не понимаю?
Если я не ошибаюсь, то объект и указатель на метод этого объекта должны быть "раздельными" для того чтобы можно было вызвать этот метод.

Цитата Сообщение от Dani Посмотреть сообщение
Все. Я понял. Оно разберет описание функции, но для вызова потребуется объект, которого вытащить не получится.
Да. Я тоже так понимаю.
1
Игогошка!
1798 / 705 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
17.10.2015, 19:21 13
Dani, заверни в лямбду.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.10.2015, 19:21

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Passing ‘const Square’ as ‘this’
g++ -std=c++11 -Wall -Werror -Wno-sign-compare -Wno-unused-result -o lab2 *.cpp btree.cpp: In...

Message Passing Interface (MPI)
Подскажите плиз как подключить mpi в шарпе? Еще вопрос библиотеку надо скачивать? Сначало я в с++...

Passing 'double' for converting 1 of 'void'
Здравствуйте! пишу метод Эйткина (для выч. мата)с графикой но выдает ошибки в коде. Помогите...

Problem with passing a list variable by a reference
Здравствуйте. Не знал, как нормально сформулировать заглавие на русском! :D В общем такая проблема....


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

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

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