Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在元组中混合左值和右值的可变模板构造函数_C++_C++17_Variadic Templates_Perfect Forwarding - Fatal编程技术网

C++ 在元组中混合左值和右值的可变模板构造函数

C++ 在元组中混合左值和右值的可变模板构造函数,c++,c++17,variadic-templates,perfect-forwarding,C++,C++17,Variadic Templates,Perfect Forwarding,我想推迟一(大)组类的实例化,其中只有一小部分将被实例化。为此,我尝试捕获变量类中构造函数的参数,该变量类将这些参数存储在元组中 我的问题是,我只成功地存储了引用或副本。但是,我需要立即将这两种类型转发给构造函数,否则我会遇到范围问题 #包括 #包括 #包括 #包括 //实例延迟的类的接口。 结构OpItf{ 虚空运算符()()=0; 虚拟~OpItf(){} }; 结构运算符:公共OpItf{ int&U i; 国际法院; //需要左值引用和右值引用。 算子(int&i,int j):_i(i

我想推迟一(大)组类的实例化,其中只有一小部分将被实例化。为此,我尝试捕获变量类中构造函数的参数,该变量类将这些参数存储在元组中

我的问题是,我只成功地存储了引用或副本。但是,我需要立即将这两种类型转发给构造函数,否则我会遇到范围问题

#包括
#包括
#包括
#包括
//实例延迟的类的接口。
结构OpItf{
虚空运算符()()=0;
虚拟~OpItf(){}
};
结构运算符:公共OpItf{
int&U i;
国际法院;
//需要左值引用和右值引用。
算子(int&i,int j):_i(i),_j(j){}

void operator(){std::cout使临时值保持活动状态的唯一方法是通过复制将它们存储到元组中。否则,通过存储引用,它们将被挂起

您可以使用
reference\u wrapper
来存储
i
,就像通过引用一样

变化:

  foundry.add< Operator >(std::ref(iref),j);  // wrap i into reference_wrapper 
  ---
  auto pfo = new Forge<Itf,Op,std::decay_t<Args>...>(std::forward<Args>(args)...);

由于
arg
已衰减,只需存储:
tuple

使临时值保持活动状态的唯一方法是将它们按副本存储到tuple中。否则,通过存储引用,它们将处于悬挂状态

您可以使用
reference\u wrapper
来存储
i
,就像通过引用一样

变化:

  foundry.add< Operator >(std::ref(iref),j);  // wrap i into reference_wrapper 
  ---
  auto pfo = new Forge<Itf,Op,std::decay_t<Args>...>(std::forward<Args>(args)...);

由于
Args
已衰减,只需存储:
tuple

我无法解决此问题。但是您有一系列警告,因此您应该首先修复它。
Forge(Args&&…Args):\u Args(std::forward(Args)…,
-您是否知道
Args
此处没有转发引用,因此“转发”它们可能不会像您期望的那样工作?我不能解决这个问题。但是您有一大堆警告,所以您应该首先解决它。
Forge(Args&&…Args):\u Args(std::forward(Args)…,
-您知道这里的
Args
没有转发引用,因此“转发”了吗它们可能不会像您期望的那样工作?谢谢,用户使用
ref
是一种约束,但我们可以接受它。谢谢,用户使用
ref
是一种约束,但我们可以接受它。
  foundry.add< Operator >(std::ref(iref),j);  // wrap i into reference_wrapper 
  ---
  auto pfo = new Forge<Itf,Op,std::decay_t<Args>...>(std::forward<Args>(args)...);
template<class Itf, class Op, typename... Args>
struct Forge : public ForgeItf<Itf> {

    std::tuple<Args...> _args;
    Itf* _instanciated;

    template<class ... Args2>
    Forge(Args2&&... args2) :
        _args(std::forward<Args2>(args2)...),
        _instanciated(nullptr)
    { }
2 1
2 2 
2 3