2012-08-15 83 views
0

如何在模板實例化時間找到模板參數的類型?例如,我想以下模板來實例化到2種不同的功能,這取決於參數:模板實例化時間typeid()

template <typename T> void test(T a) { 
    if-T-is-int { 
     doSomethingWithInt(a); 
    } else { 
     doSomethingElse(a); 
    } 
} 

當與int實例化,將得到的函數將是:

void test(int a) { doSomethingWithInt(a); } 

和時用float例如實例化,這將是:

void test(float a) { doSomethingElse(a); } 
+2

爲什麼不是正常函數的兩個重載?如果你想要的行爲不是'int'和'float',那就是你開始需要模板的地方。 – chris 2012-08-15 01:38:43

+0

@chris,我真正擁有的是一個更大的函數,它在功能上略有不同,具體取決於類型。所以我正在考慮使用你的建議,然後將大部分代碼移動到一個單獨的內聯函數中。 – rid 2012-08-15 01:56:40

+0

如果它運行得更好,也可以使用'std :: is_same':http://ideone.com/aFONa – chris 2012-08-15 02:02:27

回答

1

在你的情況,這聽起來像你需要的是兩個重載版本intfloat。對於其他類型沒有描述,所以模板不是必需的。

void test (int i) { 
    doSomethingWithInt(i); 
} 

void test (float f) { 
    doSomethingElse(f); 
} 

如果您確實需要其他類型的情況,請添加正常的模板版本。具體的過載優先。例如,see here

0
template <typename T> void test(T a) { 
    doSomethingElse(a); 
} 

template <> void test(int a) { 
    doSomethingWithInt(a); 
} 

應該工作,但是你需要考慮的情況下,你會得到一個int &const int