使用函数调用T(0)和模板进行类型转换
Type-casting using function call T(0) and templates
我有一个函数将"模拟域"转换为体素(3D像素)数组。每个体素可以是0或1,或者至少是false
或true
。由于域可以非常大,因为离散步骤可以非常小,它需要非常大的内存。
我使用我的体素数组使用FFTW3执行散射模拟(在这种情况下,如果该函数可以在double[2]
数组(FFTW3已知的复杂类型,以便我可以执行就地转换)上工作,那就太好了。但是当我使用体素数组来执行"简单"操作(例如体积分数估计)时,我只想让我的数组是我可以使用的最小类型,所以布尔数组就可以了。
我在想这样的事情:
#include <iostream>
int N = 10 ;
template<typename T>
void voxelizator(T* & Voxels) {
// N = total number of voxels, stored in a row-major 1D array
if (Voxels==NULL) Voxels = new T[N] ; //
for (int n = 0 ; n < N ; n++) Voxels[n] = T(0) ;
{ // Code to voxelizate the space -- DUMB condition
for (int n = 0 ; n<N ; n++) if (n%2==0) Voxels[n] = T(1) ;
}
}
int main()
{
int * voxOfInt = NULL ;
std::cout << "Array of int :" << std::endl ;
voxelizator(voxOfInt) ;
std::cout << "Done" << std::endl ;
for (int n = 0 ; n < N ; n++) std::cout << n << "t" << voxOfInt[n] << std::endl ;
delete[] voxOfInt ;
bool * voxOfBool = NULL ;
std::cout << "Array of boolean " << std::endl ;
voxelizator(voxOfBool) ;
std::cout << "Done" << std::endl ;
for (int n = 0 ; n < N ; n++) std::cout << n << "t" << voxOfBool[n] << std::endl ;
delete[] voxOfBool ;
}
但错误ISO C++ forbids casting to an array type 'double[2]'
被触发时,我调用这个函数与数组的双[2](复杂从FFTW3)(或int[2]像在这个例子中:)
...
typedef double complex [2] ;
...
// in main {}
complex * voxOfArray = NULL ;
std::cout << "Array of an array " << std::endl ;
voxelizator(voxOfArray) ; // It fails to call the T(0) at compile time, but i would be more than happy to explain g++ what is T(0) for int[2] ...
std::cout << "Done" << std::endl ;
for (int n = 0 ; n < N ; n++) std::cout << n << "t" << voxOfArray[n] << std::endl ;
delete[] voxOfArray ;
问题是:我在哪里可以给g++接收者类型转换:
- 当T为双精度时,T(0)变为{0,0},T(1)变为{1,0}[2]?
- 当T为布尔值时,T(0)为FALSE, T(1)为TRUE ?
注意:类型的函数调用运算符对我来说似乎很奇怪,但我知道它与我已经使用的以下符号函数一起工作得很好(请在这里插入狗做化学反应并说"我不知道我在做什么"的图片)
template <typename T> int sign(T value) {
return (T(0) < value) - (value < T(O)) ;
}
如果使用c++ 11:您可以使用如下的帮助结构体:
struct voxel_t {
double val_[2];
voxel_t() : val_{0.0, 0.0}{};
explicit voxel_t(bool b): val_{double(b), 0.0}{};
};
template<typename T>
void voxelizator(T* Voxels) {
// N = total number of voxels, stored in a row-major 1D array
if (Voxels==NULL) Voxels = new T[N]{} ; // performs below initialization
//for (int n = 0 ; n < N ; n++) Voxels[n] = T(0) ; // no longer needed
{ // Code to voxelizate the space
for (int n = 0 ; n<N ; n++) if (is_Matter(n)) Voxels[n] = T{true};
}
}
ideone上的示例用法。
这解决了double[2]的情况,对于bool类型,您不需要做任何特殊的操作
相关文章:
- 构造函数正在调用一个使用当前类类型的函数
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 类型擦除的std::function与虚拟函数调用的开销
- C++:用户定义的显式类型转换函数错误
- 模板化类如何解析在其类型之一上调用的重载非成员函数?
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 从 cpp lib 调用函数时的数据类型转换
- 使用模板和部分专用化生成类型转换函数
- 数组类型在函数调用中用作引用类型参数
- 为什么在调用隐式类型转换构造函数之后直接是驱动器
- 类型强制转换指针构造函数调用
- 如何用C++兼容的语法转换C函数调用
- 如何使用基类指针调用派生类非虚拟成员函数,而无需类型转换和使用多态性
- 将函子类型转换或调用到函数指针中
- 带联合返回类型的函数调用
- c++枚举类型可以作为函数调用吗?或者它只是一种不同风格的类型转换
- 使用函数调用T(0)和模板进行类型转换
- 不能在类型转换为void *的对象上调用成员函数指针
- 重载 C++ 类型转换(函数)