首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可变模板参数

可变模板参数
EN

Stack Overflow用户
提问于 2021-03-11 21:29:27
回答 2查看 169关注 0票数 0

如何使这个模板函数发生变化:

代码语言:javascript
复制
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);

以便能够做到:

代码语言:javascript
复制
size_t *A, *B, *C; checkedAlloc(20, A, B, C);

解决方案:

C++17:Dani

代码语言:javascript
复制
template <typename ...T>
void checkedAllocV(size_t count, T*& ...x) {
    ((checkedAlloc(count, x)), ...);
}

C++14:mch

代码语言:javascript
复制
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...);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-11 21:36:39

代码语言:javascript
复制
template <typename ...T>
void checkedAllocV(size_t count, T*& ...x) {
    ((checkedAlloc(count, x)), ...);
}
票数 2
EN

Stack Overflow用户

发布于 2021-03-11 21:43:23

C++14版本:它处理一个参数,并用一个较少的参数调用函数。终止函数,当只剩下count来中断递归时。

代码语言:javascript
复制
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...);
}

https://godbolt.org/z/16jjsb

让我们看一下这个主要函数的调用图:

代码语言:javascript
复制
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行的非模板函数中结束,什么也不做。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66590820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档