如何使这个模板函数发生变化:
template <typename T>
void checkedAlloc(size_t count, T*& x) {
x = new T[count]();
if(nullptr == x){
fprintf(stderr, "Error: not enough memory (%llux%llu bytes).\n\n", count, sizeof(T));
exit(1);
}
}
size_t *A; checkedAlloc(20, A);以便能够做到:
size_t *A, *B, *C; checkedAlloc(20, A, B, C);解决方案:
C++17:Dani
template <typename ...T>
void checkedAllocV(size_t count, T*& ...x) {
((checkedAlloc(count, x)), ...);
}C++14:mch
void checkedAlloc(size_t count) {}
template <typename T, class ... Ts>
void checkedAlloc(size_t count, T*& x, Ts&& ...args) {
try { x = new T[count](); }
catch (const std::bad_alloc) {
fprintf(stderr, "Error allocating memory (%zux%zu bytes).\n", count, sizeof(T));
exit(1);
}
checkedAlloc(count, args...);
}发布于 2021-03-11 21:36:39
template <typename ...T>
void checkedAllocV(size_t count, T*& ...x) {
((checkedAlloc(count, x)), ...);
}发布于 2021-03-11 21:43:23
C++14版本:它处理一个参数,并用一个较少的参数调用函数。终止函数,当只剩下count来中断递归时。
void checkedAlloc(size_t count) {}
template <typename T, class ... Ts>
void checkedAlloc(size_t count, T*& x, Ts&& ...args) {
x = new T[count]();
if(nullptr == x){
fprintf(stderr, "Error: not enough memory (%zux%zu bytes).\n\n", count, sizeof(T));
exit(1);
}
checkedAlloc(count, args...);
}让我们看一下这个主要函数的调用图:
int main()
{
MyClass *A;
int *B;
float *C;
checkedAlloc(20, A, B, C);
delete[] A;
delete[] B;
delete[] C;
}使用4个参数(20、A、B、C)调用checkAlloc。
这个调用分配20个A类型的元素,并使用3个参数(20、B、C)调用checkAlloc。
这个调用分配20个B类型的元素,并使用2个参数( 20,C)调用checkAlloc。
此调用分配类型为C的20个元素,并使用1参数( 20 )调用checkAlloc。
这个调用在第1行的非模板函数中结束,什么也不做。
https://stackoverflow.com/questions/66590820
复制相似问题