我在创建模板类时遇到了2个问题。我已经在下面包含了示例代码。第一个问题是我是否可以强制为模板类别扣除自动类型。即:模板类的汽车类演绎强制?
auto p = myvar;
其中myvar是T < ...>,我可以强制自动检测Q < ...>?这是简化的。请继续阅读以获得更清晰的解释。
为清楚起见进行了编辑:让我解释我在做什么。而且我还想指出,这种风格代码非常适用于大型项目。我试图添加一些功能和功能,并且除了消除一些更尴尬的行为。
该代码使用模板在n维数组上执行工作。该模板有一个顶层类,下面有一个存储类。将存储类传递到顶级类允许继承存储类的顶级类。所以我从NDimVar开始,我有NDimStor。我最终
NDimVar<NDimStor>
类不包含任何数据,除了数据的缓冲器:
class NDimStor<size_t... dimensions> {
int buffer[Size<dimensions...>()]
}
这使得类==缓冲器的地址的地址。这是整个实施的关键。这是不正确的假设吗? (我可以看到这个作品在我的系统上没有任何问题,但也许这并非总是如此。)
当我创建NDimVar < NDimStor < 10,10 > >我结束了一个10×10阵列。
我有功能,让该阵列的片,例如:
NDimVar<NDimStor<dimensions...>>::RemoveDim & get(int index);
这产生10种元素的一个新的一维数组出2D 10×10阵列的:
NDimVar<NdimStor<10>>
为了返回这个作为参考,我在我想要的数据位置使用reinterpret_cast。因此,在这个例子中,得到(3)将进行:
return reinterpret_cast<NDimVar≤NDimStor<dimensions...>>::RemoveDim&>(buffer[index * DimensionSumBelow<0>()]);
DimensionSumBelow < 0>返回在尺寸元素的总和1+,即10.所以&缓冲器[30]是被引用的1D NDimVar的地址。
所有这一切都很好。
我唯一的问题是,我想添加覆盖。例如,可以参考返回一个新的类:
NDimVar<NDimPermute<NDimStor<10,10>,1,0>>
指向相同的原始位置置换行为(交换尺寸)一起。这也很好。但我想要:
auto p = myvar.Permute<1,0>()
创建myvar与排列数据的新副本。如果我说这会工作:
NDimVar<NDimStor<10,10>> p = myvar.Permute<1,0>().
我觉得有一些汽车类型推演的东西,我会以强制返回的汽车类型做的,但我不知道。我一直无法弄清楚。再次
感谢, Nachum
我要的是:1。 我的存储,例如创建临时覆盖类A_top <A_storage>可以返回一个类型,称为A_top < A_overlay <A_storage> >而不创建新对象,它只是返回对此类型的引用。这改变了存储访问的方式。问题出在自动调用。我不希望这个类型被直接实例化。我可以修改返回到自动作为原始A_top吗?
#include <iostream>
using namespace std;
class A_storage {
public:
float arr[10];
A_storage() {
}
float & el (int index) {
return arr[index];
}
};
template <typename T> class A_overlay : T {
private:
A_overlay() {
cout << "A_overlay ()" << endl;
}
A_overlay (const A_overlay &) {
cout << "A_overlay (&)" << endl;
}
public:
using T::arr;
float & el (int index) {
return arr[10 - index];
}
};
template <typename T> class A_top;
template <typename T> class A_top : public T {
public:
A_top() {
}
A_top<A_overlay<A_storage>> & get() {
return reinterpret_cast<A_top<A_overlay<A_storage>>&>(*this);
}
};
using A = A_top<A_storage>;
int main (void) {
A a;
auto c = a.get(); // illegal - can i auto type deduce to A_top<A_storage>?
return 0;
}
- 如果函数接受(A_top <A_storage> &)作为参数,如何可以创建一个转换功能,可以投A_top < A_overlay <A_storage> > &到A_top <A_storage> &?
感谢, Nachum
如果汽车让你感到困惑,那就从不使用它开始吧。放入你想要的类型,让编译器告诉你是否有错误。不过,由于缺乏对C++基本部分的理解,你所做的事情可能太复杂。我建议从简单的事情开始。你似乎有多层混乱,这将使你难以理解你的具体问题的任何答案 - 也使你的问题难以回答,因为它有点荒谬。 – xaxxon