2013-01-13 43 views
1
if (std::is_same<T, float>::value) 
    { 
     float a; 
     somefunc_float(x,len,&a); 
    } 

上面的代碼是從一個模板,它接受一個指針X,可以是一些原始數據類型的指針(例如,x爲double *float *int *)和somefunc_float從一個lib,只能接受一個具體的數據類型爲x(在上面的例子中爲float *),編譯器總是給我錯誤,告訴我輸入數據類型(x)是不正確的,就好像表達式std::is_same<T, float>::value一樣工作?模板和is_same()不起作用?

+0

什麼是確切的錯誤信息? –

+0

它不工作*你認爲它的工作方式。類型特徵應該用在* static *設置中,即專門化和重載。 –

+0

@OliCharlesworth:「'x'不能轉換爲'float'類型嗎? –

回答

2

這個問題的描述並不完全清楚,但我想我明白你在做什麼:你在模板函數內部封裝了一段代碼,用一個可以在編譯時執行的測試,並期望編譯器會放棄該塊並且不編譯它。

模板不能像那樣工作。當模板被實例化時,整個模板被檢查和編譯,並且代碼必須正確,然後優化器才能丟棄代碼塊(在這種情況下可能會丟棄代碼塊)。

獲取該行爲的常用方法是提供用不同類型調用的模板(或非模板重載)的多個實現。編譯器會在調用的地方派發適當的實現,然後忽略其餘部分。


有在C的未來版本static if功能建議++(可能是C++ 17),這將支持你正在嘗試做的。

+0

是的,我知道重載/多模板的方式,我想節省一點時間,但它似乎永遠不會工作,無論如何感謝澄清的事情。 – user0002128

+0

@ user0002128:根據你想要做什麼,你可以將這個條件分解到一個函數中,併爲'float'和一個沒有操作的模板化版本提供一個重載。無論這是否是明智的設計,都取決於您的問題中沒有的大量信息。 –

1

類型確定爲靜態,並且實例化的所有模板代碼都必須編譯,即有意義。即使條件爲假,if聲明的內容也必須有意義。

嘗試這樣:

template <typename T> execute_if_float(T) { } 

execute_if_float(float x) { somefunc_float(x); } 


template <typename T> void myCode(T x) 
{ 
    // ... 

    execute_if_float(x); 

    // ... 
}