2014-09-22 199 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++來表達自己的能力有衝突,它是在與類型理論的基本觀點的衝突。而且,我的口味,沒有按根本就沒有任何意義,就像騙子悖論。