gpt4 book ai didi

c++ - 引用折叠和元组

转载 作者:行者123 更新时间:2023-11-30 03:35:43 27 4
gpt4 key购买 nike

我正在尝试将参数包转换为引用,因为我的函数的某些参数可能是 r-/l- 值的混合。有问题的功能:

//must return tuple
template <typename ...U>
std::tuple<U...> input(const char* format, U ...args) {
std::tuple<U...> t = std::tuple<U...> (args...);
//other code....
}

有一些测试代码我不能碰...这将调用我的函数:

template <typename... U>
std::tuple<U...> test_input(const char* fmt, U &&...inp) {
input(fmt, std::forward<U>(params)...);
//other stuff...
}

还有 2 个测试对象(也是不可触摸的)删除了复制/移动构造函数 A()B()。如:

A(const A &) = delete;            //same for B
A &operator=(const A &) = delete; //same for B

如果我按原样调用该函数,我将收到“已删除的复制构造函数”或“已删除的构造函数”错误。例如:

test_input("blah blah", 1, i, "a", std::string("a"), A(123) B("string"));

问题是它可以是 r-/l-值的任意组合,我不知道如何将它们转换为所有 be 引用

我知道我需要对参数的引用。我试过使用 std::forwardstd::forward_as_tuplestd::make_tuple,并将第二个参数更改为 inputU & ...argsU &&...args

我也明白我需要使用引用折叠:

  • A& & 变成 A&
  • A& && 变成 A&
  • A&& & 变成 A&
  • A&& && 变成A&&

我尝试使用第一条和第三条规则将任何内容转换为 A& 类型,但我仍然遇到以下错误:调用已删除的“B”构造函数 并且期望第二个参数的左值

如果我的问题不清楚 - 如何将 args(input 的第二个参数)转换为引用元组?

最佳答案

我想你想做这样的事情:

#include <tuple>
#include <string>

//must return tuple
template <typename ...U>
std::tuple<U&&...> input(const char*, U&&...args) {
return std::tuple<U&&...>(std::forward<U>(args)...);
//other code....
}

template <typename... U>
std::tuple<U&&...> test_input(const char* fmt, U &&...inp) {
return input(fmt, std::forward<U>(inp)...);
//other stuff...
}

struct A {
A(int) { }
A(const A &) = delete; //same for B
A &operator=(const A &) = delete; //same for B
};

struct B {
B(const char *) { }
B(const B &) = delete; //same for B
B &operator=(const B &) = delete; //same for B
};

int main() {
int i = 1;
test_input("blah blah", 1, i, "a", std::string("a"), A(123), B("string"));
}

[live demo]

关于c++ - 引用折叠和元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41079808/

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