我最近正在为Vulkan框架开发Vertex类。我想编写一些函数来收集有关顶点的信息(例如属性数)作为模板,而不是静态函数(这可能是更简单的方法)。因此,这些模板必须专门用于每个Vertex类。我遇到了有关模板专业化的问题
template <typename T>
constexpr uint32_t GetAttributeCount()
{
return 0;
}
template <typename T>
constexpr std::array<VkVertexInputAttributeDescription, GetAttributeCount<T>()> getAttributeDescriptions()
{
return {};
}
struct Vertex_p2_c3
{
glm::vec3 position;
glm::vec2 color;
};
// Declarations of specializations
template <>
constexpr uint32_t GetAttributeCount<Vertex_p2_c3>(); // returns 2
template <>
constexpr std::array<VkVertexInputAttributeDescription, GetAttributeCount<Vertex_p2_c3>()> getAttributeDescriptions<Vertex_p2_c3>();
最后一行出现两个错误:
C2975 '_Size': invalid template argument for 'std::array', expected compile-time constant expression
我不理解,因为GetAttributeCount
被声明为constexpr
。第二个是
C2912 explicit specialization 'std::array<VkVertexInputAttributeDescription,0> lib::getAttributeDescriptions<lib::Vertex_p2_c3>(void)' is not a specialization of a function template
如何正确地将getAttributeDescriptions
专用于Vertex_p2_c3
?