Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.205.56.209] |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Всем привет!
Есть такой вот класс: class SomeClass { private: std::string print(int number) { std::cout << number << std::endl; return "asdfdasf"; } void Print(std::function<std::string(int)> pFn) { std::string str = pFn(5); } public: void Test() { std::function<std::string(int)> pFn = &SomeClass::print; Print(pFn); //! В идеале хотелось бы избежать строчки выше и написать что то типа -> Print(&SomeClass::print) } }; Летит ошибка компиляции: Severity Code Description Project File Line Suppression State Error C2672 'std::invoke': no matching overloaded function found ConsoleApplication2 c:\program files (x86)\microsoft visual studio 14.0\vc\include\type_traits 1441 Error C2893 Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...)' ConsoleApplication2 c:\program files (x86)\microsoft visual studio 14.0\vc\include\type_traits 1441 Никак не могу ее победить. Может кто знает как тут надо правильно предать метод класса? Спасибо. Добавлено В общем мне нужно указатель на метод класса передать в метод класса, решил вот заморочится с std::function, да чего то не понимаю - почему не компилится. Вот тут вроде почти аналогичный код http://ru.cppreference.com/w/cpp/utility/functional/function За исключением того, что ему не передают в метод класса... |
Сообщ.
#2
,
|
|
|
KILLER, а кто будет this-то передавать?
|
Сообщ.
#3
,
|
|
|
Цитата D_KEY @ KILLER, а кто будет this-то передавать? А куда его передавать? У меня же не лямбда и все происходит в этом классе? Я может не совсем понял тебя, просто еще нубас в этом. Можешь пояснить? |
Сообщ.
#4
,
|
|
|
Ну так сигнатура метода-то не std::string(int), а std::string SomeClass::(int). Нужно создавать std::function<std::string(SomeClass*, int)> и биндить this первым параметром.
P.S. По крайней мере в бусте так делалось. Добавлено Цитата KILLER @ std::function<>, увы, ничегошеньки не знает о том, что он используется внутри класса, и пытается схавать ту сигнатуру, что дают. А куда его передавать? У меня же не лямбда и все происходит в этом классе? |
Сообщ.
#5
,
|
|
|
Да, так вроде получилось.
Спасибо. Добавлено Вопрос решен. |
Сообщ.
#6
,
|
|
|
class SomeClass { public: std::string print(int number) { std::cout << number << std::endl; return "asdfdasf"; } void Print(auto pFn) { std::string str = pFn(5); } void Test() { Print(std::bind(&SomeClass::print, this, std::placeholders::_1)); //! В идеале хотелось бы избежать строчки выше и написать что то типа -> Print(&SomeClass::print) } }; |
Сообщ.
#7
,
|
|
|
Да вроде получилось как Qraizer написал:
class SomeClass { private: std::string print(int number) { std::cout << number << std::endl; return "asdfdasf"; } void Print(std::function<std::string(SomeClass*, int)> pFn) { std::string str = pFn(this, 5); std::cout << str; } public: void Test() { Print(&SomeClass::print); //! В идеале хотелось бы избежать строчки выше и написать что то типа -> Print(&SomeClass::print) } }; Но тоже спасибо за код. |
Сообщ.
#8
,
|
|
|
Так в этом случае тебе и std::function не нужен.
|
Сообщ.
#9
,
|
|
|
Цитата Flex Ferrum @ Так в этом случае тебе и std::function не нужен. Вот так же подумалось. Почему просто не использовать указатель на метод? |
Сообщ.
#10
,
|
|
|
Так а зачем тогда этот std::function нужен? Без него в С как то обходятся, и в С++ обходились
|
Сообщ.
#11
,
|
|
|
Цитата KILLER @ Так а зачем тогда этот std::function нужен? Без него в С как то обходятся, и в С++ обходились Для того, чтобы сохранять произвольный функтор(в терминах C++) с заданной сигнатурой. |
Сообщ.
#12
,
|
|
|
KILLER, посмотри мой пример, там auto можно заменить на std::function<std::string(int)>.
|
Сообщ.
#13
,
|
|
|
Цитата D_KEY @ Для того, чтобы сохранять произвольный функтор(в терминах C++) с заданной сигнатурой. Ну так его и так можно сохранить без всяких std::function Я думал что std::funciton - это как бы замена для всяких указателей на функции, указателей на методы и т.д. Т.е. более общая и стандартная запись для таких вещей. Цитата shm @ KILLER, посмотри мой пример, там auto можно заменить на std::function<std::string(int)>. Да я смотрел. Но ведь весь смысл того что нужно было сделать сохранился. Добавлено Просто я не могу понять, зачем тогда этот std::function вообще нужен? Если я и так могу функтор свой налабать и его передать, а если мне влом лабать функтор, то воспользуюсь лямбдой. |
Сообщ.
#14
,
|
|
|
Цитата KILLER @ Цитата D_KEY @ Для того, чтобы сохранять произвольный функтор(в терминах C++) с заданной сигнатурой. Ну так его и так можно сохранить без всяких std::function Как? Это может быть указатель на функцию, указатель на метод, объект-функция или лямбда. И всегда это будут разные типы. Добавлено Цитата KILLER @ Если я и так могу функтор свой налабать и его передать. Передать ты можешь то, что ждут. Цитата если мне влом лабать функтор, то воспользуюсь лямбдой Так у лямбд-то разный тип. Как ты это собрался хранить? |
Сообщ.
#15
,
|
|
|
Цитата D_KEY @ Как? Это может быть указатель на функцию, указатель на метод, объект-функция или лямбда. И всегда это будут разные типы. Ну в STL алгоритмы ты как то передаешь же функторы и указатели на функции. Цитата D_KEY @ Передать ты можешь то, что ждут. Ну так чем отличается то, что например ждет std::find_if, от std::function ? Цитата D_KEY @ Так у лямбд-то разный тип. Как ты это собрался хранить? Я не понимаю твоих вопросов, ты можешь написать такой пример, где бы вот без std::function ну никак нельзя было обойтись? Если ты такой напишешь, то я его поколупаю и пойму для чего нужен этот std::function. |