Được rồi, cuối cùng tôi đã có được xung quanh để chụp ảnh này. Không giống như các giải pháp trước đó, giải pháp của tôi xây dựng toàn bộ chuỗi đầu ra tại thời gian biên dịch và cuộc gọi trong thời gian chạy duy nhất là một cuộc gọi đến toán tử cout
của một cuộc gọi <<
. Tôi đang sử dụng boost::mpl
để giữ cho mã có thể quản lý được phần nào.
#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;
}
Đáng buồn thay, mã sẽ nổ tung với việc boost::mpl::string
phàn nàn về các chuỗi quá lớn khi sử dụng bất kỳ n
lớn hơn 9.