У меня есть класс foo
с методом bar
, который принимает что-то вызываемое (указатель на функцию/функтор). это вызываемое нечто должно быть передано другому методу doit
в качестве связанного элемента с третьим методом bar_cb
.
#include <functional>
#include <iostream>
class foo {
public:
template<typename T>
void bar(T&& t) {
std::cout << "bar\n";
doit(std::bind(&foo::template bar_cb<T>, this, std::forward<T>(t)));
}
template<typename T>
void doit(T&& t) {
std::cout << "doit\n";
t();
}
template<typename T>
void bar_cb(T&& t) {
std::cout << "bar_cb\n";
t();
}
};
void lala() {
std::cout << "lala\n";
}
class functor {
public:
void operator()() {
std::cout << "functor::operator()\n";
}
};
int main() {
foo f;
functor fn;
f.bar(fn);
f.bar(std::bind(lala)); // error
return 0;
}
Это отлично работает для functors
, но не для связанных функций в качестве аргумента для foo::bar
(lala
в моем примере). Можно ли передать методу неизвестный тип и привязать его в этом методе в качестве аргумента к другому (и если да, то как)?
Я знаю, что мог бы обернуть функтор (например, std::function
) вокруг функции, но, поскольку я могу вызывать неизвестный тип, я думаю, что есть способ также связать его (я думаю, что просто упускаю что-то простое).
Вот ссылка на пример.
callable
в качестве параметра. реальный код представляет собой вариативный класс шаблона с различными функторами в качестве параметров шаблона. тем не менее, я попытался свести проблему к простому классу без шаблонов, чтобы понять, что не так. также я хочу избежать накладных расходов наstd::function
. - person user1810087   schedule 30.12.2014bind
выражений привязки. stackoverflow.com/questions/10777421/stdbind-a-bound-function< /а> - person T.C.   schedule 30.12.2014std::bind
? Живой пример. Однако не уверен в последствиях идеальной переадресации. - person Igor Tandetnik   schedule 30.12.2014unbind
, который берет выражение привязки и заключает его в тип, который не является выражением привязки? А в остальном ведет себя так же? - person Yakk - Adam Nevraumont   schedule 30.12.2014