2014-09-22 113 views
2

我很确定以下问题的解决方案是相当标准的,但我找不到合适的术语来搜索它。我有两个班,例如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<...>>>>>

+1

你的概念没有意义。 – CashCow 2014-09-22 16:50:03

+0

@CashCow:哪个概念? – Deduplicator 2014-09-22 16:50:30

+0

对不起,但直接递归类型不能在C++中定义。 – Deduplicator 2014-09-22 16:50:53

回答

1

感谢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的实例,以进行有效的过滤。

+1

对不起,但我看起来不像你在问题中描述的东西。我的意思是在SomeB 测试中'SomeA';'是一个模板。按照您的意愿,它不是'SomeA '类型。 – Kostya 2014-09-22 18:06:02

+0

@Kostya:Touché!不过,我很确定它解决了我的问题。如果我知道模板模板参数,我会以不同的方式提出问题。我确信有一个xkcd关于这个... – conner82 2014-09-22 18:49:27

0

让我们将一个相当笨拙的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++来表达自己的能力有冲突,它是在与类型理论的基本观点的冲突。而且,我的口味,没有按根本就没有任何意义,就像骗子悖论。