我有一个用2个参数声明的函数:
第一个是维度2的数组,可以是int
,string
或bool
例如,它被声明为:int array[2] = {0};
第二个参数是一个值(int
,string
或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
中不是V
的数组时出现问题。
nb:我不能用另一种方式声明变量数组。
答案 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::array
或std::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);
如果您使用例如指针或不同类型的参数,则会失败。