2013-03-08 134 views
0

這裏是我的問題:迫使特定類型的模板類

我有一個模版類

Template <class T> 
SomeClass 
{ 

    void func1(T* arg1) 

    //many methods using T 
    void func2(T* arg1); 
} 

對於大多數的情況下,相同類型的類T被傳遞到類的方法和他們的工作T的基礎(以便代碼可以是通用的)。對於一些特定的情況下,我想迫使FUNC2忽略T和使用我想要的東西,所以我可以這樣做:

void func1(T* arg1) 
{ 

    T* ptr2; 
    int* ptr1; 
    if (a specific case) 
    { 
    SomeClass<int>::func2(ptr1); 
    } 
    else 
    { 
    func2(ptr2)//so it will assume ptr2 is of type T* 
    } 
} 

似乎並沒有直截了當工作..

最後的工作代碼(其他面臨類似的問題)

#include<stdio.h> 
template <class T> 
class SomeClass 
{ 
public: 
    void func1(T arg1); 

    template< typename U > 
    void func2(U arg1); 
}; 

template< typename T > 
void SomeClass<T>::func1(T arg1) 
{ 
    if (1) 
    { 
     func2<int>(5); // U will deduce to int 
    } 
} 
template<class T> template<class U> void SomeClass<T>::func2(U arg1) 
{ 
printf("%d",arg1); 
} 

int main() 
{ 
    SomeClass<float> c; 
    c.func1(5.0); 


} 
+3

專用模板。 – chris 2013-03-08 23:59:26

+0

要調用'SomeClass :: func2',除非'func2'是一個靜態成員,否則需要一個類型爲SomeClass 的對象。要麼找到一種方法來創建這樣的對象,或者讓'func2'成爲一個靜態成員。 – 2013-03-09 00:19:29

+0

我不能使這個函數成爲靜態的,因爲它使用了一些類的數據結構。另外,我不能重載(specialize),因爲有很長的函數調用鏈,所以我將不得不專門化所有的東西,看起來好像沒有簡單的方法,所以我將不得不尋找商業邏輯中的方法。感謝回覆傢伙! – ddahuja 2013-03-09 00:37:28

回答

0

像這樣的東西可能會爲你工作:

template <class T> 
class SomeClass 
{ 
    void func1(T* arg1) 

    template< typename U > 
    void func2(U* arg1); 
}; 

的d

template< typename T > 
void SomeClass<T>::func1(T* arg1) 
{ 
    T* ptr2; 
    int* ptr1; 
    if (a specific case) 
    { 
     func2(ptr1); // U will deduce to int 
    } 
    else 
    { 
     func2(ptr2); // U will deduce to T 
    } 
} 
+0

太棒了!這實際工作,要注意一些語法的變化: 的#include 模板 類SomeClass的 { 市民: 無效FUNC1(T ARG1); template void func2(U arg1); }; 模板 空隙SomeClass的 :: func1的(T ARG1) { 如果(1) { FUNC2 (5); // U將推斷爲int } } 模板模板空隙SomeClass的 :: FUNC2(U ARG1) { 的printf( 「%d」,ARG1); } int main() { SomeClass c; c.func1(5.0); } – ddahuja 2013-03-09 02:53:16

+0

我不知道爲什麼我不能按回車(換行符)在評論中,它只是提交帖子! 好轉移輸入作品,但現在它沒有格式化代碼! – ddahuja 2013-03-09 02:53:43