【问题标题】:template declaration of array and value数组和值的模板声明
【发布时间】:2017-06-23 09:26:01
【问题描述】:

我有一个用 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:我不能以其他方式声明变量数组。

【问题讨论】:

  • 这不是有效的 C++ 代码,这一行:int[2] array = {0}; 必须是:int array[2] = {0};
  • int[2] 数组不是有效的 C++ ...
  • 很抱歉,只是打错了。已更正。
  • @rudy 为什么不直接使用std::array
  • 很遗憾我无法修改数组的声明

标签: c++ arrays templates


【解决方案1】:

只需使用一个模板参数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);

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

【讨论】:

  • 最好传递对数组的引用,因为T array[]T* array 完全相同。它仍然可以绑定到任何T*。对数组的引用将不接受指向 T 的指针。
  • @juanchopanza:谢谢我添加了!
  • 也可以将大小设为模板参数
  • @juanchopanza:再次感谢,没想到这一点。我也加了...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多