2

这是我希望能够输入的内容:

class foo : public watchKeys<A, B, C> {}; //Or any list of keys

Boost::mpl 有序列,可以让你这样做,但我不想这样做:

class foo : public watchKeys<mpl::list<A, B, C> > {};

我不介意它内部“丑陋”或冗长,但我希望 watchKeys 最终使用的方式非常简单和直观。我也不知道 boost 是如何做到的,但这似乎是因为我和模板之间有一层宏。

我该怎么办?我不希望每种类型的类型制作巨大的模板列表,但如果这是唯一的,那就是唯一的方法......

编辑:我已经相当确定没有办法做我想做的事(几乎,但你不能有可变数量的宏参数),但问题仍然在产生有用和信息丰富的答案。

4

2 回答 2

1

每种类型的巨大模板列表是当前 C++ 版本中唯一的方法。有关如何进行的示例,请参见 boost::tuple。

C++0X支持variadic templates,但这还没有得到很好的支持(我认为现代版本的 GCC 有实验性支持)。

于 2010-02-24T14:59:06.587 回答
0

或者,您可以递归地执行此操作

template<typename Head, typename Tail>
struct list { };

struct emptylist { };

class foo : public watchKeys<list<A, 
                             list<B, 
                             list<C, emptylist> > > > { };

然后你可以像这样处理它

template<typename List>
struct process;

template<typename Head, typename Tail>
struct process< list<Head, Tail> > : process<Tail> { 
  // process Head
};

template<>
struct process<emptylist> { };
于 2010-03-08T15:30:04.193 回答