2011-08-17 89 views
-4

我想修改在編譯時給出的模板類型,但無法做到這一點。讓我們看看你是否有一些想法。編譯時是否可以編輯模板名稱?

讓我們考慮我們有2個類A和A_test和一個模板類B. 將實現B類,因爲它有一個函數b_f(),它內部創建模板類的對象並調用public funcion A_f()/A_test_f()的A類或A_test類。

from main,將創建class B obj; obj.b_f(); 但我想創建類A_test的對象不是A級。

讓我知道是否有可能。

Basicaly我想做對象注入。請讓我知道是否有可能。

+2

請輸入密碼?發佈一些代碼以向我們展示你究竟做了什麼以及你到底做了些什麼! – Nawaz

+2

你想要做什麼?因爲我真的不知道你在處理什麼。 –

+0

如果您想控制b_f運行的類型,您需要將它傳遞給類型... – PlasmaHH

回答

1

到目前爲止,最好的解決方案是嘗試將A_test_f()重命名爲與A_f()相同。

如果證明是不可能的,接下來的事情我會嘗試是專門B類:

template<class AT> 
class B { 
public: b_f() { 
    AT m_A; 
    m_A.A_f(); 
}; 

template<> 
class B<A_test> { 
public: b_f() { 
    AT m_A; 
    m_A.A_test_f(); 
}; 

如果B是太複雜了,還有其他的東西來嘗試,但你可能要重新考慮你首先要做。如果一切都失敗了,請按照我在此處編碼的內容進行操作,但將其稱爲B_HELPER而不是B,然後b_f()可以這樣做:B_HELPER<AT> m_A; m_A.b_f();這樣您就不必重新編碼B的全部內容。

0

在編譯時向模板注入依賴關係的常用方法是通過類型特徵。這允許通過具有該類的特定知識的另一個結構或類從外部自定義模板。標準庫中的示例包括std::char_traits<>std::iterator_traits<>。 Boost也定義了一些,包括boost::type_traits<>

特徵涉及爲一般情況定義結構,並在必要時將其專門用於替代情況。

// general case: select method named "f". 
template<class T> struct b_traits 
{ 
    typedef void(T*F)(); 
    static const F f = &T::f; 
}; 

    // template type that forwards method selection to "b_traits" struct. 
template<class AT> 
class B { 
public: b_f() { 
    AT m_A; 
    (m_A.*(b_traits<AT>::f))(); 
}; 

class A_test { ... }; 

    // special case: select method named "A_test_f". 
template<> struct b_traits<A_test> 
{ 
    typedef void(T*F)(); 
    static const F f = &A_test::A_test_f; 
}; 

int main() 
{ 
    B<A_test> b; 
    b.b_f(); // will invoke "A_test::A_test_f()" rather than "A_test::f()". 
}