gpt4 book ai didi

c++ - 我可以使用动态数组作为 C++ 模板类型名吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:09:16 25 4
gpt4 key购买 nike

至于下面的代码:

template<typename PatternType>
cl_int enqueueFillBuffer(
const Buffer& buffer,
PatternType pattern,
::size_t offset,
::size_t size,
const VECTOR_CLASS<Event>* events = NULL,
Event* event = NULL) const
{
cl_event tmp;
cl_int err = detail::errHandler(
::clEnqueueFillBuffer(
object_,
buffer(),
static_cast<void*>(&pattern),
sizeof(PatternType),
offset,
size,
(events != NULL) ? (cl_uint) events->size() : 0,
(events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL,
(event != NULL) ? &tmp : NULL),
__ENQUEUE_FILL_BUFFER_ERR);

if (event != NULL && err == CL_SUCCESS)
*event = tmp;

return err;
}

如果数组长度6是静态指定的,代码可以通过编译。

queue.enqueueFillBuffer<float[6]>(buffer, nodes, 2345, 123456);

我的问题是如何让长度6成为一个变量并通过编译呢?由于C99支持动态数组,sizeof(float[n])可以正确获取大小(代码sizeof(PatternType))。但是我不能让下面的代码通过编译:

int n = 6;
queue.enqueueFillBuffer<float[n]>(buffer, nodes, 2345, 123456);

最佳答案

考虑使用 std::array。更一般地说,假设一个类似 STL 的容器将传递给您的方法。例如,

std::array<float, 6> nodes;
nodes[0] = ...

std::vector<float> nodes;
nodes.resize(6);
nodes[0] = ...

然后是线条

static_cast<void*>(&pattern),
sizeof(PatternType),

可以替换为

static_cast<void*>(pattern.data()),
sizeof(typename PatternType::value_type) * pattern.size(),

然后编译器可以推导出类型,所以调用方法就变成了

queue.enqueueFillBuffer(buffer, nodes, 2345, 123456);

不需要显式模板参数。

关于c++ - 我可以使用动态数组作为 C++ 模板类型名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30522608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com