gpt4 book ai didi

c++ - 完美转发在 C++ 中不起作用

转载 作者:太空狗 更新时间:2023-10-29 20:35:50 26 4
gpt4 key购买 nike

我试图理解 C++ 中转发的概念,并编写了以下代码来理解可变参数模板上的此功能。

#include<utility>
#include<string>
#include<tuple>
#include<sstream>

template<typename... Args> struct Helper_Class
{
std::tuple<Args...> argTuple;
Helper_Class(Args&&... args):
argTuple(std::make_tuple(std::forward<Args>(args)...))
{}
};

template<typename... Args> std::ostream&
operator<< ( std::ostream& os,Helper_Class<Args...> obj)
{
return os;
}

template<typename...Args>
Helper_Class< Args...>
Print(Args&&... args)
{
return Helper_Class<Args...>(std::forward<Args>(args)...);
}

template <typename... Ts>
void test( Ts &&...params) {
std::stringstream s;
s <<Print(std::forward<Ts>(params)...);
}

int main()
{
test(1,2,"foo", 'x');
}

但是,在执行代码时出现以下错误:

error: no matching function for call to ‘std::tuple<int, int, const char (&)[4], char>::tuple(std::tuple<int, int, const char*, char>)’
argTuple(std::make_tuple(std::forward<Args>(args)...))

我不明白的是,如果我正在尝试进行完美转发(意味着类型不应在函数调用之间更改),为什么要尝试更改类型?

如果这是非常基础的,请原谅,因为我是第一次学习这个概念。

更新 1:继续问题发布于:Question

最佳答案

template <typename... Ts>
void test( Ts &&...params) {
std::stringstream s;
s <<Print(std::forward<Ts>(params)...);
}

您将从这里开始。 Print 的模板参数将来自 std::forward。因此,它们将已经被转发左值/右值引用等。这就是您要在此处推送的内容,作为 Print 模板的参数。

然后:

template<typename...Args>
Helper_Class< Args...>
Print(Args&&... args)

现在将 Args... 转发给 Helper_Class,它将使用这些类型来尝试声明包含左值引用、右值引用等的元组.这不会很好地工作。

need to decay这些傻瓜:

template<typename...Args>
Helper_Class< typename std::decay<Args>::type...>
Print(Args&&... args)
{
return Helper_Class<typename std::decay<Args>::type...>(std::forward<Args>(args)...);
}

或者,让我们使用 C++14 来清理一些视觉困惑...

template<typename...Args>
auto Print(Args&&... args)
{
return Helper_Class<typename std::decay<Args>::type...>(std::forward<Args>(args)...);
}

现在使用 gcc 6.2.1 为我编译。

附言这不完全是“基本”...

关于c++ - 完美转发在 C++ 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40831580/

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