2017-06-23 30 views
1

的模板聲明我有一個函數以2個參數來聲明:陣列和值

  • 第一個是2維的陣列,可以是intstringbool 它被聲明例如像此:int array[2] = {0};

  • 第二個參數是一個值(intstring,或bool

我想聲明一個內聯模板函數來匹配不同類型的數組。比如我這樣做:

template <typename T, typename V> 
inline void affectParameter(T* array, V value) 
{ 
array[0] = value; 
} 

和cpp文件:

int value(2); 
int[2] array = {0}; 
affectParameter(array, value); 

但我想只用一個模板T爲了避免問題,如果在函數調用T ISN」 t一組V

nb:我不能以另一種方式聲明變量數組。

+0

這是無效的C++代碼,這一行:'int [2] array = {0};'一定是:'int array [2] = {0};' –

+0

int [2]數組無效C++ ... –

+0

抱歉,只是一個錯誤。糾正。 – rudy

回答

4

只需使用一個模板參數T

template <typename T> 
inline void affectParameter(T* array, T value) 
{ 
    array[0] = value; 
} 

它會完美地與您的代碼工作:

int value(2); 
int array[2] = { 0 }; 
affectParameter(array, value); 

,將無法編譯(只要你想)如果你是這樣的:

double value(2); 
int array[2] = { 0 }; 
affectParameter(array, value); /* type mismatch here */ 

但也考慮用std::arraystd::vector,因爲它們在使用上更加安全,並且是C++編程的先進技術。


如果您不能使用它們,你可以讓你的函數定義更加明確,它需要一個經典的陣列,T array[]的含義一樣在這種情況下T* array並沒有任何更安全:

template <typename T> 
inline void affectParameter(T array[], T value) 
{ 
    array[0] = value; 
} 

擴展與非類型模板參數

可以使函數類型安全,並在DEX安全的,如果你將使用非類型模板參數:

template <typename T, std::size_t N> 
inline void affectParameter(T (&array)[N], T value) 
{ 
    /* You can use N here to check size etc. */ 
    array[0] = value; 
} 

您將通過調用它:

affectParameter(array, value); 

,如果你使用例如指針或不同類型TEH參數將失敗。

+0

更好地傳遞數組的引用,因爲'T array []'和'T * array'完全相同。它仍然可以綁定到任何'T *'。對數組的引用不會接受指向'T'的指針。 – juanchopanza

+0

@juanchopanza:謝謝我補充說! –

+0

此外,尺寸可以作爲模板參數 – juanchopanza