2012-09-06 71 views
1

我在調用具有兩個模板參數的模板函數時遇到問題。具有兩個模板參數的調用函數

我有一個類,該類接受兩種不同類型的對象。我還不知道類型,所以我將它們作爲模板參數。然後我將這些對象存儲在包裝類中。最後,我希望能夠使用兩個模板參數來調用模板函數,這需要我的兩個對象。但我對如何做到這一點感到困惑。

這是一個精簡版的代碼來解釋我的問題。

template<typename A, typename B> 
void someTemplateFunction(A a, B b); 


class Problem 
{ 
    private: 
    class WrapperA 
    { 
     public: 
     virtual void doSomething() = 0; 
    }; 

    template<typename A> 
    class ConcreteWrapperA : public wrapperA 
    { 
     private: 
     A a; 
     public: 
     ConcreteWrapperB(A b_) : a(a_) {} 
     virtual void doSomething(); 
    }; 

    class WrapperB 
    { 
     public: 
     virtual void doSomething() = 0; 
    }; 

    template<typename B> 
    class ConcreteWrapperB : public wrapperB 
    { 
     private: 
     B b; 
     public: 
     ConcreteWrapperB(B b_) : b(b_) {} 
     virtual void doSomething(); 
    }; 

    WrapperA *a; 
    WrapperB *b; 

    public: 

    template<typename A> 
    void setA(A a) 
    { 
     a = new ConcreteWrapperA<A>(a); 
    } 

    template<typename B> 
    void setB(B b) 
    { 
     a = new ConcreteWrapperB<B>(b); 
    } 

    void call_someTemplateFunction(); // ??????? How do i do this? 
}; 
+0

是否每個「A」或「B」類型都已知?我的意思是,例如,你知道'B'可以是'int,long或short',只不過是。如果是,那麼我可以提供答案。另一方面,如果你可以同時設置一個功能,那麼當然使用第一個答案。 – PiotrNycz

+0

不幸的是,「A」和「B」的類型不知道。我雖然關於與訪客一起使用'boost :: variant'。但這似乎並不奏效。 –

+0

boost :: variant需要在使用boost :: variant之前已知所有可能的類型。這正是我之前問過的。對不起,問兩次相同的問題,也許我以前的Q不清楚:你知道所有可用於調用'Problem :: setA'或'Problem :: setB'的類型嗎? – PiotrNycz

回答

2

的問題是,你已經類型擦除兩種類型AB分開,所以沒有什麼地方在這兩種類型的AB已知的代碼的轉換。

如果您可以編寫單個功能template<typename A, typename B> void set(A, B)那麼您可以在該點捕獲配對類型<A, B>

或者,someTemplateFunction可以在不知道AB兩種類型的情況下同時運行嗎?


這是C++作爲一種單通獨立編譯語言設計的基礎問題。

假設你的程序有三個編譯單元; A.cpp射程類型T[A]B.cpp調用setB與類型T[B]另一範圍,C.cpp擁有Problem對象和要調用someTemplateFunction調用setA。然後編譯時沒有時間,編譯器知道A.cpp中的類型範圍B.cpp中的類型範圍,因此它不能通過適當的交叉產品T[A] x T[B]實例化someTemplateFunction

+0

我想,我明白你的答案。在實踐中,我可能同時知道'A'和'B'兩種類型,但我希望能夠添加多個'B'的對象,並且可以將它們存儲在列表中,而不必總是將'A'作爲好。 –

相關問題