【发布时间】:2017-08-06 01:21:08
【问题描述】:
我正在构建的模板类中有 2 个问题。我在下面包含了示例代码。第一个问题是我是否可以强制为模板类扣除自动类型。即:
自动 p = myvar;
myvar 在哪里是 T<...>,我可以强制自动检测 Q<...> 吗?这是简化的。继续阅读以获得更清晰的解释。
为清楚起见进行了编辑:让我解释一下我在做什么。而且我还想指出,这种风格的代码在一个大型项目上运行得非常好。我正在尝试添加一些特性和功能,并消除一些更尴尬的行为。
代码使用模板对 n 维数组执行工作。模板有一个顶层类,下面有一个存储类。将存储类传递到顶级类允许继承存储类的顶级类。所以我从 NDimVar 开始,我有 NDimStor。我最终得到了
NDimVar<NDimStor>
除了数据缓冲区之外,该类不包含任何数据:
class NDimStor<size_t... dimensions> {
int buffer[Size<dimensions...>()]
}
这使得 1234562 的地址 == 缓冲区的地址。这是整个实施的关键。这是一个不正确的假设吗? (我可以看到这在我的系统上运行没有任何问题,但也许并非总是如此。)
当我创建 NDimVar
我有获取数组片段的函数,例如:
NDimVar<NDimStor<dimensions...>>::RemoveDim & get(int index);
这会从二维 10x10 数组中创建一个包含 10 个元素的新一维数组:
NDimVar<NdimStor<10>>
为了将其作为参考返回,我在所需数据的位置使用了 reinterpret_cast。所以在这个例子中,get(3) 会执行:
return reinterpret_cast<NDimVar≤NDimStor<dimensions...>>::RemoveDim&>(buffer[index * DimensionSumBelow<0>()]);
DimensionSumBelow 返回维度为 1+ 的元素之和,即 10。因此 &buffer[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>().
我觉得我可以做一些自动类型推断的东西来强制返回自动类型,但我不确定。我一直想不通。
再次感谢, 那胡姆
我想要的是:
1. 在我的存储上创建临时覆盖类,例如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_top >& 转换为 A_top & 的转换函数?
谢谢, 那胡姆
【问题讨论】:
-
如果 auto 让您感到困惑,请从不使用它开始。输入你真正想要的类型,让编译器告诉你是否有问题。但是,鉴于您对 C++ 的基本部分缺乏了解,您正在做的事情可能太复杂了。我建议从更简单的开始。您似乎有多层困惑,这将使您难以理解对您的特定问题的任何答案 - 并且也使您的问题难以回答,因为它有些荒谬。