ごめんごめん途中で送信してしまった。
読まなくても良いくらいC++でのスタンダードな回答。

struct filter_t{ int e; const char *t; };
struct fizzbuzz_t
{
  int in;  std::string out;
  fizzbuzz_t &operator >>( filter_t &f )
    { if( 0==in%f.e ){ out.append( f.t ); } return *this; }
  operator const char *()
    {  if( out.length() ) return out.c_str();
      static char tmp[50]; itoa( in, tmp, 10 ); return tmp; }
};
fizzbuzz_t operator >>( int i, filter_t &f ){ fizzbuzz_t fb; fb.in = i; fb>>f; return fb; }
filter_t fizz = { 3, "Fizz", };
filter_t buzz = { 5, "Buzz", };
filter_t gizz = { 7, "Gizz", };

int main(){ 105>>fizz>buzz>>gizz; return 0; }