【问题标题】:Deducing function template parameters from template argument types从模板实参类型推导出函数模板形参
【发布时间】:2012-07-16 22:38:45
【问题描述】:

我目前正在尝试编写一个函数,它将任何类型的 STL 数组作为其参数之一。很明显的写法是:

template<typename T, int count>
void setArrayBufferData(GLenum usage, const std::array<T, count>& data) {
  setArrayBufferData(usage, data.data(), sizeof(T) * count);
}

这是另一个重载,仅供参考

void setArrayBufferData(GLenum usage, void* data, int size) {
  glBufferData(GL_ARRAY_BUFFER, size, data, usage);
}

函数定义编译良好。但是,当我尝试调用它时

std::array<int, 4> data;
setArrayBufferData(GL_STATIC_DRAW, data);

我收到“调用 'setArrayBufferData' 时没有匹配的函数”错误消息。我知道如果我在调用中指定了模板参数,它会起作用,但我希望调用推断它们。我已经尝试研究模板模板参数,一个更通用的声明,然后是一个 std::array 专业化,以及我能想到的所有其他语法变体,但我似乎无法找到一种方法来获得我正在寻找的东西为了。有没有可能,如果有,需要做什么?

【问题讨论】:

    标签: c++ templates


    【解决方案1】:
    template<typename T, int count>
    void setArrayBufferData(GLenum usage, const std::array<T, count>& data)
    

    不正确,因为 std::array 是 template&lt;typename T, size_t N&gt; struct array。第二个参数的类型必须是size_t,而不是int

    此外,data.data() 返回 const T*,因为 data 是对 std::array 的 const 引用,因此,请尝试使用 setArrayBufferData(GLenum usage, const void* data, int size) 或使用 setArrayBufferData(usage, const_cast&lt;T*&gt;(data.data()), sizeof(T) * count); 调用它

    #include <array>
    
    void function(const void* ptr, size_t bytes)
    {
    }
    
    template<typename T, size_t count>
    void function(const std::array<T, count>& array)
    {
       function(array.data(), sizeof(T) * count);
    }
    
    int main()
    {
       std::array<int, 4> array;
       function(array);
    }
    

    这个例子运行良好。 http://liveworkspace.org/code/2a5af492e1f4229afdd0224171854d1c

    【讨论】:

    • 我从没想过将 int 更改为 size_t。一旦你这样做了,那么 void* 的常量就会变得更加明显。谢谢。现在可以了。
    猜你喜欢
    • 1970-01-01
    • 2015-09-19
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 2011-07-15
    • 1970-01-01
    相关资源
    最近更新 更多