2015-07-11 29 views
0

給定一個模板C++函數C++ - 03:如何初始化模板化類型以清零POD數據或默認構建非POD數據?

template <typename data> 
void example(data arg) { 
    // How to get POD zero initialized and non-POD, default constructor? 
    data x(); 
    ... 
} 

我如何可以零出一個模板參數,如果它是POD(例如int得到了0float得到一個0.0等)或,非-POD,使用它的默認構造函數?

我看到類成員,這是因爲explained here處理有:

struct X 
{ 
    int x; 
}; 

X x;  //x.x is not initialized 
X y = X(); //y.x is 0 

但在這種情況下,變量是不是一類的一員,那麼你如何相應地得到初始化的這種效果POD類型變量和默認構造非POD類型變量?

+0

您是否試圖清除'arg'(如'arg = 0;'爲某些特定類型),或試圖聲明一個與'arg'類型相同的變量,並對其進行值初始化?如果前者,那裏有什麼'x'?如果是後者,那裏有什麼'arg'? – hvd

+0

[C++中POD類型的默認初始化]的可能的重複(http://stackoverflow.com/questions/15212261/default-initialization-of-pod-types-in-c) –

+3

'data x = data();' –

回答

0
template <typename data> 
void example(data arg) 
{ 
    arg = 0; 
} 

對於非POD-S

  1. 定義哪些設置爲零此對象
  2. 過載 「=」 運算符
1

可以使用const T& data = T();適當複製構造。這是保證避免副本等,並且T將被值初始化,這是需要它的類型的默認構造,或者對於所有其他類型是0。

+1

我很好奇,如果OP需要在創建的類型上調用非const成員,可以使用它做任何事情嗎?通過UB的const引用這個引用來創建一個非const引用,或者定義,因爲實際的臨時構造不是const? –

+0

@NirFriedman,是的,我至少有一種情況,數據不能是const的,因爲它的值有條件地更新,但我不想要一個可能的UMR,因此我需要一個默認的初始化。 – WilliamKF

0

我很抱歉,甚至寫這個方案,但你可以使用boost做到這一點,並鍵入性狀字面上對每個不同的代碼路徑:

template <class T> 
void f(typename boost::enable_if<boost::is_pod<T>, int>::type = 0) { 
    T t = T(); 
    g(t); 
} 

template <class T> 
void f(typename boost::disable_if<boost::is_pod<T>, int>::type = 0) { 
    T t; 
    g(t); 
} 

template <class T> 
void g(const T & t) { 
    std::cerr << t.x << std::endl; 
} 

也許你應該使用is_trivially_constructible特質,而不是的is_pod。我知道這不完全美麗,但它應該工作,並且可以很好地擴展。我假設編譯器會在性能上做一些聰明的事情,但是如果你真的擔心,你可以強制g(這是你的函數的其餘部分將被實現的地方)總是被內聯到f中。

+1

函數的默認模板參數是C++ 11標準的一部分,在C++ 03 –

+0

@PiotrS中不可用。好的,我會糾正的。 –

相關問題