gpt4 book ai didi

c++ - 根据模板 C++ 的类型具有可变类型的类成员

转载 作者:太空宇宙 更新时间:2023-11-04 11:30:18 26 4
gpt4 key购买 nike

我正在尝试编写一个模板类来管理主机和 Nvidia GPU 上的指针,类似于 boost::shared_ptr .为此,我需要在类中定义 2 个指针,一个用于主机,一个用于 GPU。

template<typename T>
class GPUSharedPtr
{
protected:

T *cpu_pointer;
T *gpu_pointer;
}

CUDA 的问题在于它为 std::complex<double> 定义了自己的类型和 std::complex<float> , 这是 cuDoubleComplexcuComplex分别。

template<typename std::complex<double> >
class GPUSharedPtr
{
protected:

std::complex<double> *cpu_pointer;
cuDoubleComplex *gpu_pointer;
}


template<typename std::complex<float> >
class GPUSharedPtr
{
protected:

std::complex<float> *cpu_pointer;
cuComplex *gpu_pointer;
}

在这两种情况下,如何为 GPU 使用不同类型的指针?

谢谢!

最佳答案

为什么不将两者都添加为模板参数:

template<typename CPU_T, typename GPU_T>
class GPUSharedPtr
{
protected:
CPU_T *cpu_pointer;
GPU_T *gpu_pointer;
};

int main()
{
GPUSharedPtr<std::complex<double> , cuDoubleComplex> g1;
GPUSharedPtr<std::complex<float> , cuComplex> g2;
return 0;
}

或者(如果在您的情况下更有意义),您可以按照 MooingDuck 的建议使用标签分派(dispatch)来正确默认 GPU 指针类型的值:

template<class CPU_T> struct DefaultGPU_T { typedef CPU_T type;};
template<> struct DefaultGPU_T<std::complex<double>> { typedef cuDoubleComplex type;};
template<> struct DefaultGPU_T<std::complex<float>> { typedef cuComplex type;};

template<typename CPU_T, typename GPU_T=typename DefaultGPU_T<CPU_T>::type>

class GPUSharedPtr
{
protected:
CPU_T *cpu_pointer;
GPU_T *gpu_pointer;
};

int main()
{
GPUSharedPtr<int> g0;
GPUSharedPtr<std::complex<double>> g1;
GPUSharedPtr<std::complex<float>> g2;
return 0;
}

Live demo.

关于c++ - 根据模板 C++ 的类型具有可变类型的类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25021992/

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