在一个项目中,我有几个类,其中封装了作为静态数组实现的矩阵,例如:
struct StaticContainer
{
static const short e[2][4];
};
/// Initialize components of member-array (with external linkage).
const short StaticContainer::e[2][4] = {
{ -1, 0, 0, 1 },
{ 0, -1, 1, 0 }
};
我想实现一个提供反向映射的元函数,从 StaticContainer::e 中的列返回到第二个索引(在本例中为 1-4)。理想情况下,是这样的:
template< typename TContainer, short TeX, short TeY >
struct VectorToIndex
{
enum { value = ??? };
};
最后,我想通过(如果这可能的话):
BOOST_STATIC_ASSERT( 0 == VectorToIndex< StaticContainer, -1, 0 >::value );
这可能吗?我最初尝试递归搜索'e'矩阵失败了,因为每当我尝试访问(在编译时)我得到的条目(GCC):
error: ‘StaticContainer::e’ cannot appear in a constant-expression
我应该明白矩阵中的值在编译时不可用吗?
我将不胜感激任何评论。我可以随意更改矩阵的初始化/存储方式(所以我在考虑一些编译时注册机制)。唯一的限制是在编译时获得这种反向映射。
说明:
e-matrix 中的每一列代表一个空间方向(在本例中为 2D)。保证列是不同的。
我希望元函数得到以下结果:
VectorToIndex< StaticContainer, -1, 0 > --> '0' at compile-time VectorToIndex< StaticContainer, 0,-1 > --> '1' at compile-time VectorToIndex< StaticContainer, 0, 1 > --> '2' at compile-time VectorToIndex< StaticContainer, 1, 0 > --> '3' at compile-time
如果这个模板是用无效的数字组合(即不是矩阵中的列)实例化的,我想产生一个编译错误。
- 我目前拥有的解决方案是一个简单的程序,它手动编写具有必要模板实例的文件。这满足了要求(结果是正确的,并且对于无效向量存在编译时错误 - 因为缺少相应的模板实例化)。但是,由于我的代码库中有许多类似于“StaticContainer”的类(其中许多具有较大的矩阵),因此此过程会生成数千行代码:(。