小编Pav*_*tov的帖子

使用constexpr函数的返回值作为另一个函数的参数

我有一个constexpr从字符串文字计算CRC32哈希的函数。

template <size_t len>
constexpr uint32_t ctcrc32(const char (&str)[len]) {
    return detail::crc32<len - 2>(str) ^ 0xFFFFFFFF;
}
Run Code Online (Sandbox Code Playgroud)

(指其他constexpr功能)

我想做的是调用其他一些接受uint32_t值的函数,并使用它访问某些中的数据unordered_map。这样的调用看起来像这样:

uniformByNameCRC32(ctcrc32("uPointLight.position"));
Run Code Online (Sandbox Code Playgroud)

我希望"uPointLight.position"的哈希值在构建时进行一次计算,然后将结果常量传递给uniformByNameCRC32(),但事实并非如此,并ctcrc32()在运行时被调用,这基本上会杀死CPU,因为我有很多uniformByNameCRC32()调用。

但是,这很好用:

std::array<uint64_t, ctcrc32("string_literal")> array;
Run Code Online (Sandbox Code Playgroud)

这样的代码将编译并指示ctcrc32()的返回值确实是一个constexpr

我在这里想念什么?

c++ templates constexpr c++14

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

模板函数从多个嵌套的unordered_map的值中提取值

假设我有一个std::unordered_map看起来像这样的嵌套:

std::unordered_map<ResourceName, std::unordered_map<HAL::ResourceFormat::Color, HAL::RTDescriptor>>
Run Code Online (Sandbox Code Playgroud)

我想要一个函数,该函数将HAL::RTDescriptor基于两个键ResourceName以及HAL::ResourceFormat::Color是否存在对象返回一个指向的指针nullptr。简单的实现如下所示:

const HAL::RTDescriptor* ResourceDescriptorStorage::GetRTDescriptor(ResourceName resourceName, HAL::ResourceFormat::Color format) const
    {
        auto mapIt = mRTDescriptorMap.find(resourceName);

        if (mapIt == mRTDescriptorMap.end()) {
            return nullptr;
        }

        auto& nestedMap = mapIt->second;
        auto nestedMapIt = nestedMap.find(format);

        if (nestedMapIt == nestedMap.end()) {
            return nullptr;
        }

        return &nestedMapIt->second;
    }
Run Code Online (Sandbox Code Playgroud)

有没有办法使用模板来概括逻辑?一些带有参数包的键。将在每个嵌套容器中进行检查,检查对象是否可用,然后将其返回或nullptr在末尾返回:

template<
        template<class...> class AssociativeContainer,
        class... Keys
    >
        decltype(auto) Find(const AssociativeContainer<...>& rootContainer, Keys&&... keys)
    {
        ...
    }
Run Code Online (Sandbox Code Playgroud)

c++ recursion templates variadic-templates

4
推荐指数
1
解决办法
69
查看次数

如何在Swift 3中使用glVertexAttribPointer函数?

在OpenGL ES(3.0)和Objective-C中使用缓冲区和顶点属性时,我使用

glBufferData(GL_ARRAY_BUFFER, sizeof(attributes), attributes, GL_DYNAMIC_DRAW);
Run Code Online (Sandbox Code Playgroud)

将一些顶点数据(属性)加载到缓冲区中,然后

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, sizeof(VertexCoordinatesStruct) / sizeof(GLfloat), GL_FLOAT, GL_FALSE, sizeof(VertexAttributesStruct), 0);

glEnableVertexAttribArray(1);
glVertexAttribPointer(1, sizeof(TextureCoordinatesStruct) / sizeof(GLfloat), GL_FLOAT, GL_FALSE, sizeof(VertexAttributesStruct), (void *)sizeof(VertexCoordinatesStruct));
Run Code Online (Sandbox Code Playgroud)

在缓冲区中为顶点着色器指定顶点数据内存布局.注意我是如何在第二次glVertexAttribPointer调用中将sizeof(OGLVertexCoordinates)转换为Void*.这是在TextureCoordinatesStruct数据所在的GL_ARRAY_BUFFER中的偏移量.

然后我试图在Swift 3中实现相同类型的代码.但glVertexAttribPointer函数将UnsafeRawPointer作为最后一个参数,而不是void*.

这是我无法解决的问题:我无法在Objc中创建具有某些特定值(内存偏移)的UnsafeRawPointer.

我已经研究过所有Q/AI都可以找到的,但是它们都不适合我的情况,或者根本不适用于Swift 3.

opengl-es ios swift3

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