Вы действительно не можете использовать лямбда-решение? Жаль.
В любом случае ... в вашем коде есть некоторые проблемы.
Если вы хотите использовать совершенную пересылку в bind_and_forward()
, вам нужно использовать ссылки для пересылки, поэтому вам нужно добавить&&
после Args
объявления аргументов функции
template <class Ret, class ...Args>
void bind_and_forward (Args && ... args)
// .........................^^
, и я также предлагаю позволить компилятору выводить типы Args...
, не объясняя их при вызове bind_and_forward()
bind_and_forward<int>(std::move(b));
// ..............^^^ only the return type
Но реальная проблема (проблема, которая вызывает ошибку компиляции) состоит в том, что вы удалили B
конструктор копирования
struct B{
B(const B&) = delete; // <-- copy constructor deleted
B(){}
B(B &&b){}
};
, но вы получили аргументы (также B
) при копированиив A::send()
template<typename Ret, typename... Args>
struct A{
Ret send(Args... argx){ // <-- argx are copies
return Ret();
}
};
Вы должны выбрать: вы можете добавить конструктор копирования в B
struct B{
B(const B&) = default; // <-- now you have copy constructor
B(){}
B(B &&b){}
};
или вы можете получить argx
в качестве константных ссылок (избегая копирования)
template<typename Ret, typename... Args>
struct A{
Ret send(Args const & ... argx){ // <-- now by const reference
return Ret();
}
};