小编Tar*_*ani的帖子

返回std :: tuple并移动语义/复制elision

我有以下工厂功能:

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)

这真的需要吗?

c++ move-semantics c++17

10
推荐指数
1
解决办法
405
查看次数

类模板内部类的类似元组的结构化绑定

我想为类模板的内部类提供结构化绑定。我怎样才能专门研究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++ templates inner-classes c++17 structured-bindings

5
推荐指数
1
解决办法
375
查看次数

静态内联成员初始化顺序

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)

c++ static-initialization c++17

5
推荐指数
1
解决办法
8693
查看次数

Variadic模板,其参数与实例一样多

我想创建一个模板类,它接受的参数与在程序中调用的次数一样多.其用法应如下:

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并创建它们的适当"联合".我认为"概念"是可能的,但同时有可行的解决方案吗?

c++ templates c++17

3
推荐指数
1
解决办法
75
查看次数

仅使用存储在GPU内存中的'count'参数调用glDrawArray

我在#1绘制调用期间在片段着色器中生成了一个缓冲区(作为SSBO访问)。然后,我想使用该缓冲区(作为VBO访问)作为绘图调用#2的输入。

问题是,使用函数void glDrawArrays(GLenum mode, GLint first, GLsizei count),我应该知道countCPU上的值。但是在CPU上,我不知道该值。该值仅作为原子计数器存储在GPU内存中。

有什么方法可以使用count存储在GPU内存中的值作为参数进行绘图调用?

我知道我可以从GPU检索值,然后在CPU中使用它,但是由于同步,这会使程序变慢。

opengl opengl-4

2
推荐指数
1
解决办法
43
查看次数