数组和值的模板声明

时间:2017-06-23 09:26:01

标签: c++ arrays templates

我有一个用2个参数声明的函数:

  • 第一个是维度2的数组,可以是intstringbool 例如,它被声明为:int array[2] = {0};

  • 第二个参数是一个值(intstringbool

我想声明一个内联模板函数来匹配不同类型的数组。例如,我这样做:

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中不是V的数组时出现问题。

nb:我不能用另一种方式声明变量数组。

1 个答案:

答案 0 :(得分: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;
}

使用非类型模板参数进行扩展

如果您将使用非类型模板参数,则可以使函数类型安全并且索引安全:

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);

如果您使用例如指针或不同类型的参数,则会失败。