c++ - 从模板参数类型推导函数模板参数

标签 c++ templates

我目前正在尝试编写一个函数,它将任何类型的 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 特化,以及我能想到的所有其他语法变体,但我似乎无法找到一种方法来获得我正在寻找的东西为了。这甚至可能吗?如果可能,需要做什么?

最佳答案

template<typename T, int count>
void setArrayBufferData(GLenum usage, const std::array<T, count>& data)

不正确,因为 std::array 是 template<typename T, size_t N> struct array .第二个参数的类型必须是 size_t , 不是 int .

此外,data.data() 返回 const T*,因为数据是对 std::array 的 const 引用,所以,尝试 setArrayBufferData(GLenum usage, const void* data, int size)或者用 setArrayBufferData(usage, const_cast<T*>(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

关于c++ - 从模板参数类型推导函数模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11505852/

相关文章:

在 QVector 中使用指针和非指针参数的 C++ 模板

c++ - 是否有理由更喜欢一个变量的多个 unordered_map 而不是一个结构?

c++ - C++ 如何获取本地时间

c++ - 根据析构函数和 move 构造函数实现 move 赋值

c++ - 在 QTableView 模型字段中显示图像和文本

c++ - 我应该如何存储对象

c++ - 如何让模板类型名类的两个(或更多)实例使用相同的函数

C++ 多重继承和模板

templates - 防止模板中转义正斜杠

c++ - 递归模板函数在初始化时导致负数组大小