对不起,这是一个受欢迎的主题(例如here),但我找不到合适的解决方案来解决我的问题。显示代码太长而且令人困惑,所以我只是显示peudo代码;这是一个关于设计的问题,我正在寻找适用于C ++(11)的模式。
目标:我正在处理多维数组(例如,包含矢量字段的4D数组),我想访问具有nD坐标和动态边界条件的数组元素。
对象:
value_type operator[] (unsigned)
); unsigned operator() (Coordinates)
); 要求
问题:
给定一个带有边界条件的n-D容器,我希望给定坐标处的值的请求如下所示:
value_type operator() ( Coordinates )
{
if ( Boundary.transforms_coordinates )
{
/**
* 1) Ensure the coordinates are inbound by applying boundary conditions;
* 2) Use the Indexer to find the corresponding 1D index.
*/
return Array[ Indexer(
Boundary.transform( Coordinates )
) ];
}
else
{
if ( Indexer.coordinates_are_inbound( Coordinates ) )
return Array[ Indexer(Coordinates) ];
else
return Boundary.outbound_value;
}
}
我无法解决的问题是:如果边界是动态设置的,其类型不能是模板值,因此它需要是指向边界接口的指针。但是,此接口无法定义虚拟模板方法transform
以接受不同类型的坐标(更不用说纯虚拟坐标)。
我猜这里有一个基本的设计缺陷,如果你能告诉我在哪里,理想情况下如何纠正它,我将非常感激。对不起问题的长度;这可以通过我不知道的设计(原型)模式来解决。
答案 0 :(得分:0)
我要感谢@Yakk提出的精彩建议,但我认为我将使用数组容器的隐式扩展来访问边界值。
这是因为当我想要访问可能受边界条件限制的值时,我不需要一个完整的容器接口,而只是一个访问方法;我应该知道什么时候我的程序需要边界条件,什么时候不需要。这是一个伪代码:
struct BoundedContainerAccessor
{
Array *data;
Indexer *indexer;
void accept( Array& a, Indexer& i )
{
data = &a;
indexer = &i;
}
template <class T>
value_type operator() ( T coordinates )
{
if (indexer->coordinates_are_inbound( coordinates ))
{
return data->[indexer->( coordinates )];
}
else
{
// Implementation-specific, either:
// return a value, throw an error, or transform coordinates
}
}
};