【发布时间】:2010-02-25 22:09:47
【问题描述】:
我正在尝试编写一些元编程代码,例如:
- 从某个类
foo<c1, c2, c3, ...>继承会导致从key<c1>, key<c2>, key<c3>, ...继承 - 最简单的方法不太奏效,因为您不能多次从同一个空类继承。
- 处理“...”部分并不漂亮(因为它是复制意大利面),但可以。
好的,下面是尝试:
template<char c0, typename THEN, typename ELSE>
struct char_if
{
typename THEN type;
};
template<typename THEN, typename ELSE>
struct char_if<0, THEN, ELSE>
{
typename ELSE type;
};
class emptyClass {};
template<char c> class key
{
char getKey(){return c;}
};
template<char c0, char c1, char c2, char c3, char c4>
class inheritFromAll
{
typename char_if<c0, key<c0>, emptyClass>::type valid;
class inherit
: valid
, inheritFromAll<c1, c2, c3, c4, 0>::inherit
{};
};
template<char c1, char c2, char c3, char c4>
class inheritFromAll<0, c1, c2, c3, c4>
{
class inherit {};
};
template<char c0 = 0, char c1 = 0, char c2 = 0, char c3 = 0, char c4 = 0>
class whatINeedToDo
: public inheritFromAll<c0, c1, c2, c3, c4>::inherit
{
bool success(){return true;}
};
int main()
{
whatINeedToDo<'A', 'B', 'c', 'D'> experiment;
return 0;
}
我最初虽然可以使用 Boost::Mpl 来做到这一点,但老实说我不知道怎么做;我不知道你如何在不明确知道... 部分的情况下传递list<...>。
只是在做:
template<> class key<0> {};
不起作用,因为如果我有多个 0 参数,我会尝试从同一事物继承两次。 (如果您能想到解决方法,那也可以)。
我也没有尝试过宏,因为我认为我对它们的了解比对元编程的了解要少,所以它们可能是一种解决方案。
有什么想法吗?
编辑:我有一个不好的解决方案。我仍然想要一个元编程解决方案,用于学习,但不好的解决方案是:
template<char c1, char c2, char c3> class inheritFromMany
: public key<c1>
, public key<c2>
, public key<c3>
{
};
template<char c1, char c2> class inheritFromMany<c1, c2, 0>
: key<c1>
, key<c2>
{
};
Edit2:哇,但我忘记了一部分。我需要将一个变量传递给 ''key'' 的构造函数——在所有情况下都是一样的,但这是必要的。
Edit3:寻址 cmets:
- 我不希望用户多次提交同一个字符。如果他们这样做了,我只想从那个键继承一次——我的意思是,我想我没有提到那是因为你不能这样做?这就是为什么其他更简单的解决方案不起作用的原因?
- 实际上,key 是信号/槽(通道)行为的包装器。频道保存了一个回调列表,实际上就是
virtual key<ch>::callback。因此,从键继承可以让您访问该键的通道,让(或使)您提供回调。keyInput<ch1, ch2, ch3,...>是一个包装器,所以你不必key<ch1>, key<ch2>, key<ch3>
【问题讨论】:
-
您错过了问题中的重要信息:您想要实现什么。如果出现多次包含相同元素的列表,您希望发生什么?仅从
key<ch>继承一次删除重复项?
标签: c++ templates metaprogramming multiple-inheritance