给出以下代码:

enum Fruits{ eApple, eBanana };

template<>
struct SomeFruit< eApple > {
    void eatIt() { // eat an apple };
};

template<>
struct SomeFruit< eBanana > {
    void eatIt() { // eat a banana };
};

有没有一种方法可以为每个eatIt()调用显式专门的Fruits,而不必手动进行每个调用?

我对“手动拨打每个电话”的定义是:
void eatAllFruits()
{
    SomeFruit< eApple > apple;
    apple.eatIt();
    SomeFruit< eBanana > banana;
    banana.eatIt();
}

显然,这种方法必须在每次修改eatAllFruits时扩展Fruits

最佳答案

我现在的猜测是您要自动迭代枚举水果。实际上,有一种方法可以做到这一点。看一下我在博客上写的关于一个类似问题的文章:http://crazyeddiecpp.blogspot.com/2010/02/using-mplforeach-to-fill-tuple.html

注意mpl::range和mpl::for_each的使用。

因此,您的eatSomeFruit()函数如下所示:

// modify enum...
enum Fruits { eApple, eBananna, eFruitLast = eBananna };

struct eat_fruit
{
  template < typename Index >
  void operator() (Index&)
  {
    SomeFruit<Index::value> eater;
    eater.eatIt();
  }
};

void eatSomeFruit()
{
  mpl::for_each< mpl::range<0, eFruitLast> >(eat_fruit());
}

10-02 02:59