2013-08-31 125 views
1

有用於檢測是否類型是否匹配這一標準方式:C++模板化類型檢查編譯時線程安全嗎?

template<class T, class U> 
struct is_same { static const bool value = false; }; 

template<class T> 
struct is_same<T, T> { static const bool value = true; }; 

我用它是這樣的:

if (SamTypeCheck<double,double>::value) 
    cout<<"same"<<endl; 
else 
    cout<<"different"<<endl; 

if (SamTypeCheck<int,double>::value) 
    cout<<"same"<<endl; 
else 
    cout<<"different"<<endl; 

這看起來,因爲它使用靜態成員變量對我來說不是線程安全的。它真的不是線程安全的嗎?該代碼以某種方式困惑了我。有什麼更換,以使具有相同功能的線程安全的東西?

爲什麼我需要這個?

我有一個處理矩陣的模板化類,我想用英特爾編譯器數學核心庫進行矩陣乘法和反演,其中函數對於每種類型都是不同的,所以我必須在執行之前知道類型矩陣運算。

謝謝。

+0

靜態成員不是一個好的設計。使用繼承(儘管如評論中所說,這些都是編譯時檢查 - 對於線程安全來說不是問題) –

回答

3

這看起來對我來說不是線程安全的,因爲它使用靜態成員變量。

它採用靜態不斷成員變量(「常變量」 ... ^^讓我們說「靜態成員常量」)。通常所說的「不是線程安全的」是靜態的mutable變量(「mutable」意思是「非const」,不一定用關鍵字mutable定義)。

你有時可以看到enum { value = 0 };(或1)代碼,而不是static const bool value = false;(或true),但它通常被認爲是一個「黑客」,你失去了bool類型。

此外,在C++ 11中,直接使用標頭<type_traits>中的std::is_same

+5

因爲它可能不是顯而易見的,所以請注意,對is_same結構成員的每次訪問都是編譯時評估的,所以沒有任何線程不安全行爲的空間。 – Erbureth

+0

@Erbureth真的,謝謝你指出。 –

1

如前所述,這些都是編譯時檢查,所以線程安全不是問題。這麼說,你應該總是使用繼承的類型檢查,因爲這是一個更好/更優雅的設計(其次是標準庫的實現)

喜歡的東西

template<typename U, typename T> struct is_same : public std::false_type {}; 
template<typename T> struct is_same<T, T> : public std::true_type {}; 

的std ::真/假的種類中,STD :: integral_constant「值」