我有以下工厂功能:
auto factory() -> std::tuple<bool, std::vector<int>>
{
std::vector<int> vec;
vec.push_back(1);
vec.push_back(2);
return { true, vec };
}
auto [b, vec] = factory();
Run Code Online (Sandbox Code Playgroud)
在退货声明被vec认为是xvalue或prvalue因此移动或复制被删除?
我的猜测是否定的,因为编译器std::tuple在return语句中进行列表初始化时仍然不知道vec将被销毁.所以也许需要一个明确的std :: move:
auto factory() -> std::tuple<bool, std::vector<int>>
{
...
return { true, std::move(vec) };
}
auto [b, vec] = factory();
Run Code Online (Sandbox Code Playgroud)
这真的需要吗?
我想为类模板的内部类提供结构化绑定。我怎样才能专门研究std::tuple_size这个内部类?
我无法对数据成员使用结构化绑定,因为内部类可能是与该功能不兼容的类型。所以我需要提供类似元组的结构化绑定。为了向内部类提供这样的功能,我需要部分专注std::tuple_size于namespace std. 问题是我得到了参数(外部类)的非推导上下文。T
我知道我可以将内部类放在全局命名空间中,从而解决每个问题,但是有什么方法可以得到相同的结果,保持类内部?
#include <tuple>
template<typename T>
class Collection
{
public:
struct Element
{
int id;
T actual_element;
};
//...
};
namespace std
{
template<typename T>
struct tuple_size<typename Collection<T>::Element> // Error! Non-deduced context
: std::integral_constant<std::size_t, 2> {};
}
//Collection iterators...
int main()
{
Collection<int> collection;
for (auto & [id, element] : collection) //what I'd like to achieve
//do some stuff...
}
Run Code Online (Sandbox Code Playgroud) C++ 中一个众所周知的问题是静态初始化顺序失败。当使用C++17 静态内联成员时,它仍然被认为是一个问题吗?
这是一个示例,其中静态内联成员在两个不同的翻译单元(a.cpp 和 b.cpp)中用作两个非内联静态成员的初始化程序:
计数器.hh
#pragma once
#include <vector>
#include <fstream>
class Counter
{
public:
Counter() { std::ofstream os("o.txt", std::ofstream::app); os << "Counter created" << std::endl; }
~Counter() { std::ofstream os("o.txt", std::ofstream::app); os << "Counter destroyed" << std::endl; }
void add_instance()
{
++m_instances;
std::ofstream os("o.txt", std::ofstream::app); os << "Counter increased: " << m_instances << std::endl;
}
void remove_instance()
{
--m_instances;
std::ofstream os("o.txt", std::ofstream::app); os << "Counter decreased: " << m_instances << std::endl;
}
private: …Run Code Online (Sandbox Code Playgroud) 我想创建一个模板类,它接受的参数与在程序中调用的次数一样多.其用法应如下:
template<typename... Ts>
class A
{
std::variant<Ts> v;
};
Run Code Online (Sandbox Code Playgroud)
如果在程序的其余部分我将实例化
A<int> a;
A<double> b;
Run Code Online (Sandbox Code Playgroud)
然后我想如果编译器可以实例化这种类:
class A
{
std::variant<int, double> v;
};
Run Code Online (Sandbox Code Playgroud)
相反,如果在另一个程序中我实例化:
A<std::vector<int>> c;
A<std::list<float>> d;
A<char> e;
Run Code Online (Sandbox Code Playgroud)
然后编译器可以实例化:
class A
{
std::variant<std::vector<int>, std::list<float>, char> v;
};
Run Code Online (Sandbox Code Playgroud)
问题的核心是,我懒得在A每次使用不同类型时更改类型参数.所以我想如果编译器可以计算所有用法A并创建它们的适当"联合".我认为"概念"是可能的,但同时有可行的解决方案吗?
我在#1绘制调用期间在片段着色器中生成了一个缓冲区(作为SSBO访问)。然后,我想使用该缓冲区(作为VBO访问)作为绘图调用#2的输入。
问题是,使用函数void glDrawArrays(GLenum mode, GLint first, GLsizei count),我应该知道countCPU上的值。但是在CPU上,我不知道该值。该值仅作为原子计数器存储在GPU内存中。
有什么方法可以使用count存储在GPU内存中的值作为参数进行绘图调用?
我知道我可以从GPU检索值,然后在CPU中使用它,但是由于同步,这会使程序变慢。