I assume that you are calling the function as follows:
int main() { int i; char c; objectsDo(&Object::close, i, c); }
The problem is that the template arguments are output as follows:
template <typename ...Args_t> bool objectsDo(bool (Object::*func)(Args_t...), Args_t&&... args)
Args_t is output as int, char for the first parameter and int&, char& for the second. This is because of the inner workings of universal links: it works with dropping links.
Use another package parameter for the following parameters:
template <typename ...Args_t, typename... Args> bool objectsDo(bool (Object::*func)(Args_t...), Args&&... args) { }
Or make the trailing parameter an inactive context:
template <typename T> struct identity {using type = T;}; template <typename T> using identity_t = typename identity<T>::type; template <typename ...Args_t> bool objectsDo(bool (Object::*func)(Args_t...), identity_t<Args_t>... args){
source share