整数模板参数和子函数调用
Integer template parameters and subfunction calls
在这个简短的片段中,我想创建一个具有aribtrary维度的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());
我尝试使用这个站点的简单解决方案,但它告诉我"无法从'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++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 函数调用C++中的参数太少
- 将参数打包的参数传递到 std::queue 中,以便稍后使用不同的函数调用
- 为什么即使我调用参数化构造函数也会调用默认构造函数?
- 调用参数排列不变函数 f(i++, i++)
- uncrustify:如何将多行 C 函数调用的参数组合到一行上?
- 函数调用中的参数过多
- 使用显式模板参数列表和 [temp.arg.explicit]/3 的函数调用的演绎失败
- 调用参数不是原子参数的函数是此代码引发异常的原因吗?
- 如何在C++中获取lua函数作为参数,然后调用它
- x64 函数调用参数推送/移动顺序 (MSVC)
- 函数调用参数列表 (C++) 中的空格
- 以可变类模板作为函数调用参数的函数模板参数推导
- 函数调用参数中的表达式交错到什么粒度
- 函数调用参数前的双哈希值
- 创建一个向量作为函数调用参数
- 函数调用参数中的构造函数样式转换
- 取消对拆分函数调用参数的信任