/*
 * =========================================================================
 *
 *       FileName:  c11_funargs.cpp
 *
 *    Description:
 *
 *        Version:  1.0
 *        Created:  2018-01-05 13:23:53
 *  Last Modified:  2019-09-03 11:50:08
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  zt ()
 *   Organization:
 *
 * =========================================================================
 */

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stddef.h>
#include <errno.h>
#include <unistd.h>

#include <iostream>
#include <memory>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <functional>

template <typename T1>
void printarg ( T1 t )
{
  std::cout << t << std::endl;
}

template <typename ...Args>
void expand ( Args... args )
{
  int arr[] = { ( printarg ( args ), 0 )...};
}

template <typename ... Args>
void Test ( Args... p )
{
  fprintf ( stderr, "num=%lu\n", sizeof... ( p ) );
}

class A
{
  public:
    A ( int a )
    {
      std::cout << a << std::endl;
    }
    ~A()
    {
    }
};

class B
{
  public:
    B ( int a, int b )
    {
      std::cout << a << " " << b << std::endl;
    }
    ~B()
    {
    }
};

template <typename T, typename... Args>
T* Instance ( Args&& ... args )
{
  return new T ( std::forward<Args> ( args )... );
}

int main ( int argc, char* argv[] )
{
  ( void ) argc;
  ( void ) argv;

  //Test ( 1, 1 );
  //expand ( "asdf", "ss", 22, 2.0 );

  A* pa = Instance<A> ( 1 );
  B* pB = Instance<B> ( 2, 3 );

  return 0;
}