现在我有一个只有一个构造函数的类
ShaderProgram(std::initializer_list<std::reference_wrapper<const Shader>> shaders);
我正在使用引用包装器,因为我没有引用的initializer_list而且我无法复制
此代码有效
Shader v{ Shader::Type::Vertex, readFile("res/simple.vert") };
Shader f{ Shader::Type::Fragment, readFile("res/simple.frag") };
ShaderProgram shader{ v, f };
但这不是
ShaderProgram shader{
Shader { Shader::Type::Vertex, readFile("res/simple.vert") },
Shader { Shader::Type::Fragment, readFile("res/simple.frag") }
};
我应该在这里介绍什么?我想我缺少某种构造函数来处理rvalues但我似乎无法使它工作
当前的错误是:
E1776函数“std :: reference_wrapper&lt; _Ty&gt; :: reference_wrapper(_Ty&amp;&amp;)[with _Ty = const core :: graphics :: Shader]“(在”c:\ Program Files(x86)\ Microsoft Visual“第1830行声明 工作室\ 2017年\社区\ VC \工具\ MSVC \ 14.10.25017 \包括\ type_traits“) 无法引用 - 它已被删除 函数RenderEngine Main.cpp(77)
答案 0 :(得分:1)
reference_wrapper
。所以你所做的事情是不可能的。
在我看来,你的界面似乎有些困惑。一方面,Shader
是不可复制的类型。但另一方面,您似乎想要使用ShaderProgram
prvalues调用Shader
,这些prvalues将在构造ShaderProgram
对象后立即销毁。
我说,有ShaderProgram
的两个接口:一个接受initializer_list<Shader>
的接口:这样的用户对保持Shader
个对象在函数的初始化之后不感兴趣。另一个将对Shader
个对象的非空指针的数组/向量/等进行处理。这适用于那些希望在创建程序后保留Shader
个对象的用户。
还可以创建一个可变参数模板,您需要所有元素都是Shader
类型。如果没有C ++ 17的特性,最后一部分(验证所传递的所有类型都是某种形式的Shader
)是非常困难的。