#include <iostream>

#define DEF_HOGE(x)                             \
  static void x##_hoge(int a);                  \
  static void x##_hoge(double y);

#define DEF_HOGE_IMPL(x)                                \
  void Hoge::x##_hoge(int a)                            \
  {                                                     \
    std::cerr << "int " << a << std::endl;              \
  }                                                     \
  void Hoge::x##_hoge(double a)                         \
  {                                                     \
    std::cerr << "double " << a << std::endl;           \
  }

struct Hoge
{
  DEF_HOGE(foo)
  DEF_HOGE(bar)
};

DEF_HOGE_IMPL(foo)
DEF_HOGE_IMPL(bar)

int main()
{
  Hoge::foo_hoge(10);
  Hoge::bar_hoge(3.5);
  return 0;
}