2013-04-07 57 views
4

我想使用來自構造函數參數的推斷類型作爲我的類的其餘部分的模板參數。這可能嗎?C++ - 從構造函數中使用推斷的模板參數作爲模板參數throughtout類

事情是這樣的:

class AnyClass 
    { 
    public: 
     template<Class C> 
     AnyClass(C *c) { 
     //class C is inferred by constructor argument 
     } 
     // constructor argument is used as argument in other template types 
     nestclass<C> myNestedClass; 
     void randomfunction(C *randonarg) { 
     } 
    } 

詳情:

事情是這樣的。我試圖初始化我的基類型給定繼承類的類型。在下面的情況下,DerivedA繼承自Base,但是DerivedB繼承自DerivedA,因此,從我所瞭解的Base的構造函數(在DerivedA中找到)中的值this實際上將是指向DerivedB的指針,因此Base中的推斷類型將是類型DerivedB。不過,我想在我的基類的其餘部分使用這種類型,而不僅僅限於構造函數。

class Base { 

// type T derived from inheriting class 
template<T> 
Base(T *) {}; 
//like to use other places 
void randomfunction(T *arg1) { 
//does something with type T 
}; 
} 

class DerivedA : publicBase { 

DerivedA() : Base(this) { //this should be a pointer to DerivedB, since it is inherited 
          //from DerivedB. 
} 

} 

class DerivedB : class DerivedA { 
//anything 
} 

**我的主要目標是在我的基類中使用繼承類類型。我意識到這是一個不同的qst,但我認爲我的解決方案會在我原來的問題中找到。

我在考慮使用中介方法(類似於下面提出的功能),但不知道它是否可行。

感謝您的幫助!

+0

不,我給出了下面相關問題的答案,但您可以更詳細地描述您的使用案例,並可能解決您遇到的實際問題! – Yakk 2013-04-07 16:32:08

+1

也許你想看看[CRTP](http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern)(奇怪的循環模板模式)? – dyp 2013-04-07 17:02:16

+0

是的,CRTP是正確的做法。如果您需要一個到父級的單一二進制接口,請執行兩階段CRTP,接口類和CRTP實施基礎,然後派生。 – Yakk 2013-04-07 18:59:04

回答

5

但是你可以讓你的整個類模板類,並創建一個工廠函數,它類型推演來生成模板類。

template<typename C> 
class AnyClass { 
public: 
    AnyClass(C* c); 
    std::vector<C> vec; 
}; 
AnyClass<C> make_any_class(C* c) { 
    return AnyClass<C>(c); 
}; 
+0

我明白這一點,但我擔心它會挫敗AnyClass的最初目的。從名字來看,我傾向於相信OP想要達到類似擦除的效果,即「提升::任何」報價 – 2013-04-07 16:05:26

+0

@AndyProwl可能 - 我推測OP想要的是能夠從推斷類型,而不是具有多種類型的統一類。我懷疑'boost :: function'提供的類型擦除更適合:在你使用'pImpl'模式的地方存儲一個類型擦除的'AnyClass_impl *',並從你的'AnyClass'到你的'AnyClass_impl_interface *'。但是,真正的,OP的問題的答案是「不」,爲了通過字符限制,我包含了一個OP沒有問的問題的答案。 – Yakk 2013-04-07 16:31:14

+0

是的,我明白你的意思(可能類似[this](http://stackoverflow.com/a/15175744/1932150))。但確實,OP的具體問題的直接答案是「否」,所以+1 – 2013-04-07 16:41:23

相關問題