gpt4 book ai didi

c++ - 如何实现内部实现依赖于模板参数的类?

转载 作者:行者123 更新时间:2023-11-30 04:05:01 26 4
gpt4 key购买 nike

我想编写一个类,使其内部实现取决于模板参数。例如(我不知道这是否可能),假设我可以写这样的东西:

MyClass<double,1> a;

然后这将在编译时扩展为:

class MyClass{
double d;
public:
MyClass(){d=0;}
};

如果相反,我将其实例化为:

MyClass<double,2> a;

它将扩展为:

class MyClass{
double d[3];
public:
MyClass(){for(int i=0;i<3;i++) d[i]=0;}
};

这在某种程度上可以使用模板吗?请注意,我不想使用双* d,因为我希望一切都是静态的。

提前谢谢你。

最佳答案

是的,您可以通过部分特化来做到这一点:

// base template must be defined first
template <class T, std::size_t N>
class MyClass {
T d[N+1];
public:
MyClass() { for (std::size_t i=0; i<N+1; i++) d[i] = 0; }
};

// then the partial specialization for N = 1:
template <class T>
class MyClass<T, 1> {
T d;
public:
MyClass() { d = 0; }
};

我对基本版本有点不确定——当用值 2 实例化时,您将它显示为扩展到数组中的三个项目,这就是我上面所做的。不过,我期望这是用值 3 实例化的结果。如果那是您真正想要的,请将 N+1 都更改为 N

另请注意,至少对于专用版本,您通常希望使用初始化而不是赋值,因此 ctor 更像是:

MyClass() : d(0) {}

或(最好):

MyClass() : d(T()) {}

您可能还想为 N=0 包含一个不会编译的特化(或者,大约等效地,在基本模板中使用 static_assert 以确保 N >1).

关于c++ - 如何实现内部实现依赖于模板参数的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23486074/

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