c++ - 如何使用可变参数模板初始化指针?

标签 c++ pointers templates c++17 variadic-templates

如何使用可变参数模板正确分配指针。

我试过这个:

#include <iostream>
using namespace std;

void init() { cerr << "EMPTY" << endl; }

template <typename A, typename ...B> void init(A argHead, B... argTail) 
{
    argHead = new bool;
    *(argHead) = true;
    init(argTail...);
}

int main(int argc, char *argv[]) 
{
    bool *a1,*a2;
    init(a1,a2);
    std::cout << (*a1) << " " << (*a2) << std::endl;

    return 0;
}

但它不起作用。

最佳答案

您可以通过引用传递可变参数:

template <typename A, typename ...B> void init(A& argHead, B&... argTail)
//                                             ^^          ^^^^^^^^^^^^^^
{
    argHead = new bool{true};
    init(argTail...);
}

或者使用 std::refreference_wrapper 传递给参数

#include <functional>  // std::ref

int main()
{
    bool* a1, * a2;
    init(std::ref(a1), std::ref(a2));
    //   ^^^^^^^^^^^^  ^^^^^^^^^^^^
}

或者,如果您有权访问 你可以使用 fold expression 喜欢:

template <typename... Args> void init(Args&... args) 
{
    ((args = new bool{ true }), ...);
}

正如评论中提到的@LightnessRacesinOrbit,args 经历分配,而不是初始化。

关于c++ - 如何使用可变参数模板初始化指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57449615/

相关文章:

c++ - 模板类型参数的 Sizeof 成员变量

c++ - 我应该删除内部创建线程的类的复制构造函数和赋值运算符吗?

c++ - Solaris 5.10 x86 CC 链接器错误 : ld: fatal: library -lcryptoki: not found

c - 将文本文件中的数字读入动态分配的二维数组

c - 交换单向链表中的节点

c++ - 指针和指针的地址如何共享相同的内存地址?

c++ - 有什么方法可以编写一个类,使得不能从它继承任何类?

c++ - 如何让一个 pthread 在另一个线程正在等待 C++ 中的信号量时继续?

c++检查模板参数是否派生自某个基类

c++ - 类模板的注入(inject)类名