좋아, 나는 마침내 이것에 총을 쏜다. 이전 솔루션과는 달리 내 솔루션은 컴파일시에 전체 출력 문자열을 구축하고있는 유일한 런타임 호출 단일 호출이다 cout
'의 <<
운영자입니다. boost::mpl
코드를 다소 관리하기 쉽도록 사용 하고 있습니다.
#include <boost/mpl/string.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/char.hpp>
#include <boost/mpl/if.hpp>
using namespace boost::mpl;
using std::cout;
template<int n> struct IntToString {
typedef typename push_back<typename IntToString<n/10>::str, char_<'0'+n%10> >::type str;
};
template<> struct IntToString<0> {
typedef string<> str;
};
template<int n> struct FizzBuzzHelper {
typedef typename push_back<typename IntToString<n>::str, char_<'\n'> >::type intstring;
typedef typename if_< bool_<n%15==0>, string<'fizz','buzz','\n'>,
typename if_< bool_<n%5==0>, string<'buzz','\n'>,
typename if_< bool_<n%3==0>, string<'fizz','\n'>,
intstring>::type >::type >::type str;
};
template<int n> struct FizzBuzz {
typedef typename insert_range<typename FizzBuzz<n-1>::str,
typename end<typename FizzBuzz<n-1>::str>::type,
typename FizzBuzzHelper<n>::str>::type str;
};
template<> struct FizzBuzz<0> {
typedef string<> str;
};
#include <iostream>
int main() {
cout << c_str<FizzBuzz<9>::str>::value;
return 0;
}
슬프게도 코드는 9보다 boost::mpl::string
큰 문자열을 사용할 때 너무 큰 문자열에 대한 불평으로 폭발합니다 n
.