Skip to content

Instantly share code, notes, and snippets.

@bgaff
Created April 26, 2012 05:50

Revisions

  1. bgaff created this gist Apr 26, 2012.
    41 changes: 41 additions & 0 deletions fizzbuzz.cpp
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,41 @@
    /*
    * fizzbuzz.cpp
    *
    * Created on: Apr 25, 2012
    * Author: Brian Geffon
    *
    * fizzbuzz solved without looping or conditionals using only template recursion.
    */

    #include <iostream>
    #include <string>

    template <int r> struct FizzBuzzPrinter {
    static const int fizzBuzzed = 0;
    template <typename T> FizzBuzzPrinter(T t) {}
    };

    template <> struct FizzBuzzPrinter<0> {
    static const int fizzBuzzed = 1;
    template <typename T> FizzBuzzPrinter(T t) {
    std::cout << t;
    }
    };

    template <int N> struct FizzBuzz: FizzBuzz<N - 1> {
    FizzBuzz() {
    FizzBuzzPrinter<(N % 15)>("FizzBuzz");
    FizzBuzzPrinter<(N % 5) + FizzBuzzPrinter<N % 15>::fizzBuzzed>("Buzz");
    FizzBuzzPrinter<(N % 3) + FizzBuzzPrinter<(N % 15)>::fizzBuzzed + FizzBuzzPrinter<(N % 5) + FizzBuzzPrinter<N % 15>::fizzBuzzed>::fizzBuzzed>("Fizz");
    FizzBuzzPrinter<FizzBuzzPrinter<N % 3>::fizzBuzzed + FizzBuzzPrinter<N % 5>::fizzBuzzed>(int(N));
    std::cout << std::endl;
    }
    };

    template <> struct FizzBuzz<0> {};

    int main (int argc, char **argv)
    {
    FizzBuzz<100> p;
    return 0;
    }