gpt4 book ai didi

c++ - 整数模板参数和子函数调用

转载 作者:搜寻专家 更新时间:2023-10-31 02:07:38 27 4
gpt4 key购买 nike

在这个简短的片段中,我想创建一个具有任意维度的 Eigen::Tensor(在不受支持的模块中)。

template
<typename T>
Tensor<T, 2> convertNPToEigen2D(np::ndarray const & arr)
{
//Some checking...
T* raw_arr_data = reinterpret_cast<T*>(arr.get_data());
TensorMap<Tensor<T, 2>> arr_eigen(raw_arr_data,
arr.shape(0), arr.shape(1));
//...
return arr_eigen;
}

您当然可以看到,如果没有可变参数模板,我必须为每个可能的维度数复制此函数。这似乎是一个非常基本的示例,可变参数模板可以避免大量代码重复:

template
<typename T, uint64_t dims>
Tensor<T, dims> convertNPToEigenND(np::ndarray const & arr)
{
//Some checking...
T* raw_arr_data = reinterpret_cast<T*>(arr.get_data());
TensorMap<Tensor<T, dims>> arr_eigen(raw_arr_data,
/*arr.shape(0), ..., arr.shape(dims-1)*/);
//...
return arr_eigen;
}

由于我没有参数包,因此在将其转换为可变参数模板代码时遇到了一些问题。我想也可以让调用者完成工作,即

convertNPToEigenND<float, arr.shape(0), arr.shape(1), arr.shape(2)>(arr)

但如果可能的话,我更喜欢上述解决方案。我认为查找这个问题很容易,但我发现的大多数问题都涉及现有的参数包,而不是创建一个。

提前致谢!

编辑

谢谢,解决方案完美运行。我需要的另一个简单扩展是:

array<int, sizeof...(Is)> shuffle_tens = { Is... };
reverse(shuffle_tens.begin(), shuffle_tens.end());

我尝试使用来自 this site 的简单解决方案,但它告诉我“无法从‘ints<5,4,3,2,1,0>’转换为‘int’”。

再次感谢 Jarod42,

array<int, sizeof...(Is)> shuffle_tens = { (sizeof...(Is) - Is - 1)... };

对我有用。

最佳答案

您可以使用 std::index_sequence:

template <typename T, size_t ... Is>
Tensor<T, sizeof...(Is)> convertNPToEigenNDHelper(np::ndarray const & arr,
std::index_sequence<Is...>)
{
//Some checking...
T* raw_arr_data = reinterpret_cast<T*>(arr.get_data());
TensorMap<Tensor<T, sizeof...(Is)>> arr_eigen(raw_arr_data, arr.shape(Is)...);
//...
return arr_eigen;
}

template
<typename T, uint64_t dims>
Tensor<T, dims> convertNPToEigenND(np::ndarray const & arr)
{
return convertNPToEigenNDHelper<T>(arr, std::make_index_sequence<dims>());
}

std::index_sequence/std::make_index_sequence 是 C++14,但可以在 C++11 中实现。

关于c++ - 整数模板参数和子函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48418200/

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