Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用函数调用T(0)和模板键入强制转换_C++_Templates_Casting - Fatal编程技术网

C++ 使用函数调用T(0)和模板键入强制转换

C++ 使用函数调用T(0)和模板键入强制转换,c++,templates,casting,C++,Templates,Casting,我有一个将“模拟域”转换为体素阵列(3D像素)的功能。每个体素可以是0或1,或者至少是false或true。 由于域可能非常大,离散化步骤可能非常小,因此需要非常大的内存量 我使用我的体素阵列使用FFTW3执行散射模拟(在这种情况下,如果函数可以在double[2](FFTW3知道复杂类型,因此我可以执行就地变换)的阵列上工作,那就太好了)。但是当我使用我的体素阵列执行“简单”操作(例如体积分数估计)时我只希望我的数组是我能使用的最小类型,这样一个布尔数组就可以了 我在想下面的事情: #incl

我有一个将“模拟域”转换为体素阵列(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 ;

}
问题是:我在哪里可以给g++提供typecast的答案:

  • 当T是双[2]时,T(0)到{0,0}和T(1)到{1,0}
  • 当T是布尔值时,T(0)变为FALSE,T(1)变为TRUE
注: 类型的函数调用运算符对我来说似乎很奇怪,但我知道它可以与我已经使用的以下符号函数配合使用(请在这里插入狗做一些化学反应并说“我不知道我在做什么”的图片)

模板整数符号(T值){
返回值(T(0)
如果您使用的是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};
    }
}
struct体素{
双值[2];
体素t():val{0.0,0.0}{};
显式体素t(bool b):val{double(b),0.0}{};
};
模板
空心体素化器(T*体素){
//N=存储在行主1D数组中的体素总数
如果(体素==NULL)体素=new T[N]{};//执行以下初始化
//对于(int n=0;nfor(int n=0;更具描述性但技术上仍然错误的术语是
构造函数调用cast
:the
T(无论什么)
看起来像是对
T
的构造函数的调用,但是像数组和
int
s这样的基本类型当然没有构造函数,C风格的强制转换语法只适合于创造性代码。你能提供一个示例,说明你是如何尝试调用
体素化器的吗。我认为如果t是一个由
double[2]
(或任何其他数组类型)组成的数组,你根本无法将其分配给数组;
voxels[n]=无论什么;
都是无效的(AFAIK)。如果
voxels[n],你在RHS上尝试放置的任何东西都是无效的
是一个数组。请改用
std::vector
。@Pascail很抱歉,你做错了。你让你的代码变得更复杂、更脆弱、更容易出错,而且你在藐视最佳实践。我喜欢这种解决问题的方法,但我没有使用C++11。顺便说一句,我可以创建神奇的函数来正确地进行转换,但我永远不会如果我理解得很好,可以返回一个双精度[2]。我说得对吗?是的,你说得对。要返回数组,你需要将它们封装在一个结构中。我想对你的答案投“最有用的评论”一票,但我太年轻了,不能这么做。
template <typename T> int sign(T value) {
    return (T(0) < value) - (value < T(O)) ; 
}
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};
    }
}