首先感謝Noah Roberts的回答值得作爲給予好評的是靈感,這個答案。
從他的回答中,我提取並重構了boost::mpl::for_each
和boost::mpl::range
,以獲得我認爲滿足問題標準的最小完整定義。它不再對任何升壓和扶養被用作這樣的:
struct eat_fruit; // As Noah's answer
void eatAllFruit()
{
EnumIteration< Fruits, eApple, eTotal >::for_each(eat_fruit());
}
我EnumIteration
結構如下所定義的,我歡迎任何意見或改進。與Boost版本唯一的區別在於該範圍不包括最終的枚舉值(即eTotal
),而不包括包含它的boost::mpl::range
。
template< typename ENUM, ENUM BEGIN, ENUM END >
struct EnumIteration
{
private:
template< ENUM N >
struct Iterator
{
static const ENUM value = N;
typedef Iterator< static_cast<ENUM>(N+1) > next;
operator ENUM() const { return static_cast<ENUM>(this->value); }
};
template< typename T >
struct End
{ enum { value = false }; };
template<>
struct End< Iterator<END> >
{ enum { value = true }; };
template< bool done = true >
struct for_each_impl
{
template< typename Iterator, typename F >
static void execute(Iterator*, F) {}
};
template<>
struct for_each_impl<false>
{
template< typename Iterator, typename F >
static void execute(Iterator*, F f)
{
f(typename Iterator());
typedef typename Iterator::next next;
for_each_impl< End<next>::value >::execute(static_cast< next * >(0), f);
}
};
public:
template< typename F >
static void for_each(F f)
{
typedef Iterator<BEGIN> first;
for_each_impl< End<first>::value >::execute(static_cast< first * >(0), f);
}
};
這並不完全清楚你想要做什麼,但它聽起來像你想要使用虛擬功能。 – 2010-10-27 15:55:13
@Adam Rosenfield:我真的只是對這種模式感興趣,這個問題來自http://stackoverflow.com/questions/3997038/ – dukedave 2010-10-27 16:04:32