Я хочу построить структуру, которая позволит мне вызывать функции-члены с неопределенным количеством параметров. Пока что я написал что-то вроде этого
template<typename Class, typename Return, typename ... Args>
struct Caller
{
private:
std::function<Return(Args ...)> callerFunction;
Caller() = delete;
Caller(const Caller&) = delete;
Caller(Caller&&) = delete;
Caller& operator=(const Caller&) = delete;
public:
~Caller() = default;
Caller(Class& instance, Return(Class::*function)(Args ...))
{
callerFunction = [&instance, function](Args... args)
{
return (instance.*function)(args ...);
};
}
Return operator() (Args ... args)
{
return callerFunction(args ...);
}
};
Боюсь, я не могу обойти тот факт, что я не могу объявить переменную std::function как std::function<Return<Args&& ...)> callerFunction
Когда я пытаюсь сделать это, компилятор говорит, что он не может преобразовать из int
в int&&
(если, например, параметры равны int
s), поэтому я предполагаю, что функция видит Args&& ...
как пакет параметров ссылок rvalue. Я прав?
Есть ли обходной путь?
Редактировать: Хорошо, я неправильно объявлял функцию внутри конструктора Caller.
Неверный путь --> Caller(Class& instance, Return(Class::*function)(Args&& ...))
Верный путь --> Caller(Class& instance, Return(Class::*function)(Args ...))
(Я думаю) правильная реализация
template<typename Class, typename Return, typename ... Args>
struct Caller
{
private:
std::function<Return(Args&& ...)> callerFunction;
Caller() = delete;
Caller(const Caller&) = delete;
Caller(Caller&&) = delete;
Caller& operator=(const Caller&) = delete;
public:
~Caller() = default;
Caller(Class& instance, Return(Class::*function)(Args ...))
{
callerFunction = [&instance, function] (Args&&... args)
{
return (instance.*function)(std::forward<Args>(args) ...);
};
}
Return operator() (Args&& ... args)
{
return callerFunction(std::forward<Args>(args) ...);
}
};
Теперь вопрос: почему мне все равно нужно объявлять функцию без двойного &?
Caller<A, bool, int, int, int> caller(a, &A::foo);
. В любом случае, я бы изменил структуру, используяstd::forward
, когда это необходимо. - person Astinog   schedule 29.09.2017