C++简单模板递归
我很确定以下问题的解决方案是相当标准的,但我找不到合适的术语来搜索它。我有两个班,例如SomeB<A>
和SomeA<B>
。我想创建一个SomeB<A>
的实例,其中A:=SomeA<B>
和B:=SomeB<A>
。 (简化)的代码如下所示:C++简单模板递归
template<typename A>
class SomeB
{
A getA() { /* ... */ }
};
template<typename B>
class SomeA
{
B getB() { /* ... */ }
};
int main(int argc, char **argv)
{
SomeA<SomeB<SomeA<SomeB<...> > > > test;
// /\
// |
// +---- recursion
test.getB();
return 0;
}
现在,我该如何告诉编译器,有没有“suprises”像SomeA<SomeB<SomeA<SomeB<Suprise_AnotherA<...>>>>>
?
感谢Vittorio Romeo将我指向模板模板参数。这一次编译和作品:
template<template<typename> class A>
class SomeB
{
public:
A<SomeB> getA() { return A<SomeB>(); }
};
template<typename B>
class SomeA
{
public:
B getB() { return B(); }
};
int main(int argc, char **argv)
{
SomeB<SomeA> test;
test.getA();
return 0;
}
对于那些谁是好奇元信息:SomeB是一棵树(节点)类和SomeA是查找树节点的特定子类。 SomeA可以用许多不同的方式实现,并且它可以使用它自己的数据结构来存储儿童,即SomeB的实例,以进行有效的过滤。
让我们将一个相当笨拙的C++表示法更改为更类型化的(ish)表示法,以便我们可以尝试清楚地定义您想要的内容。
template<typename A> class SomeB { ... };
其实意味着你有一个名为SomeB
是发生在一个简单的类型和返回另一个简单类型啄:
SomeB : typename -> typename
并举例说,如果你有“模板的模板参数”的事这样的:
template<template<typename> class A> class SomeB { ... };
然后将翻译成这样:
SomeB : (typename -> typename) -> typename
现在这里是我如何理解你想要的。你说“我有这两个家伙在这里”
SomeA : typename -> typename
SomeB : typename -> typename
“如果我想申请喜欢SomeA<SomeB>
那会是非法的,因为SomeB
不是typename
- 这是typename->typename
如果只能我申请这SomeB
的东西得到一个简单类型...
哦,怎么样我申请它像SomeB<SomeA>
不,那会是非法的,因为SomeB
不是typename
- !?这是typename->typename
。如果我只能将SomeA
应用于某种简单的类型...
哦!我如何应用它像SomeA<SomeB>
?不,这是非法的,因为SomeA
不是typename
- 它是typename->typename
。如果我只能将SomeB
应用于某种简单的类型...
哦!我如何应用它像SomeB<SomeA>
?不,这是非法的,因为SomeA
不是typename
- 它是typename->typename
。如果我只能将SomeB
应用于某些事物以获得简单类型...“
等等 - 你有想法,这是非常相似,像the liar paradox所有经典逻辑悖论更正式,你想要做什么是所谓的impredicative definition
你猜是什么。? Type theory was invented伯特兰罗素准确摧毁非直谓性。
所以你的意图不只是那些用C++来表达自己的能力有冲突,它是在与类型理论的基本观点的冲突。而且,我的口味,没有按根本就没有任何意义,就像骗子悖论。
你的概念没有意义。 – CashCow 2014-09-22 16:50:03
@CashCow:哪个概念? – Deduplicator 2014-09-22 16:50:30
对不起,但直接递归类型不能在C++中定义。 – Deduplicator 2014-09-22 16:50:53