#include <iostream>

static void printHelper()
{
}

template <typename T>
static void printHelper(T&& arg)
{
    std::cout << arg;
}

template<typename T, typename ...Args>
static void printHelper(T&& arg, Args&& ...args)
{
    std::cout << arg << ", ";
    printHelper(args...);
}

class Factory
{
public:
    template<typename ...Args>
    static void testFunc(Args&& ...args)
    {
        std::cout << "inside function; args are: ";
        printHelper(args...);
        std::cout << std::endl;
    }
};

int main()
{
    void (*pFunc1)() = &Factory::testFunc<>;
    pFunc1();
    
    void (*pFunc2)(int&&, char&&, double&&) = &Factory::testFunc<int, char, double>;
    pFunc2(1, 'a', 3.14);
}