#include <functional>

class Foo
{
public:
    void bar1(int )
    {
        /// No-op.
    }

    void bar2(const int &)
    {
        /// No-op.
    }

    void foo(int x)
    {
        _wrapper_bar1(x);           /// No problems to deduce type
        _wrapper_bar2(x);           /// No problems to deduce type

        _wrapper(&Foo::bar1, x);    
        _wrapper(&Foo::bar2, x);    
    }

private:
    template <typename ...Args, typename ...Arg2s>
    void _wrapper(void (Foo::*method) (Args ...), Arg2s&& ...args)
    {
        /// Do some common stuff here...

        (this->*method)(std::forward<Arg2s>(args)...);
    }

    template <typename ...Args>
    void _wrapper_bar1(Args && ...args)
    {
        bar1(std::forward<Args>(args)...);
    }

    template <typename ...Args>
    void _wrapper_bar2(Args && ...args)
    {
        bar2(std::forward<Args>(args)...);
    }
};

int main()
{
    Foo().foo(123);
}
