我有一个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。
我在这里想念什么?
假设我有一个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) 在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.