gpt4 book ai didi

c++ - 如何在构造函数中转发所有未知参数来初始化成员对象?

转载 作者:行者123 更新时间:2023-11-30 02:29:05 24 4
gpt4 key购买 nike

我正在尝试做这样的事情:

struct Foo {
int _val;
Foo(int v) : _val(v){}
};

struct Bar {
const std::string &_name;
Bar(const std::string &name) : _name(name) {}
};

template<typename T>
struct Universal {
T _t;
Universal(...) : _t(...) {}
};

// I want to use Universal for Foo abd Bar in the same way:
Universal<Foo> UF(9); // 9 is for Foo
Universal<Bar> UB("hello"); // "hello" is for bar

在上面的代码中,我想将 Universal 的构造函数中的所有参数转发给 T 的构造函数。

我该怎么做?

最佳答案

你需要让Universal构造函数成为可变参数模板,并使用参数包和完美转发。

template<typename T>
struct Universal {
T _t;

template <typename... Args>
Universal(Args&&... args) : _t(std::forward<Args>(args)...) {}
};

不幸的是,正如 AndyG 在评论中指出的那样,这意味着如果您尝试复制非 const Universal 对象,则转发版本将成为首选 - 因此您需要显式 const 和非 const 复制构造函数!

template<typename T>
struct Universal {
T _t;

template <typename... Args>
Universal(Args&&... args) : _t(std::forward<Args>(args)...) {}

Universal(const Universal& rhs): _t(rhs._t) {}
Universal( Universal& rhs): _r(rhs._t) {}

// ... but not move constructors.
};

或使用 this answer 中所示的 SFINAE 方法, 以确保首选默认构造函数。

关于c++ - 如何在构造函数中转发所有未知参数来初始化成员对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39977551/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com