关于c ++:另一个虚拟模板解决方法

Yet another virtual template workaround

对不起,这是一个很受欢迎的话题(如这里),但我找不到合适的方法来解决我的问题。显示代码将太长,令人困惑,所以我只是展示PUDO代码;这是一个关于设计的问题,我在这里寻找一个适用于C++(11)的模式。

目标:我正在处理多维数组(例如,一个包含向量场的4D数组),我想访问具有N-D坐标和动态边界条件的数组元素。

物体:

  • 数组:将数据作为一维数组存储在内存中,并重载订阅(value_type operator[] (unsigned))。
  • 索引器:存储N-D数组的尺寸,并将N-D坐标转换为一维索引(unsigned operator() (Coordinates))。
  • 边界:转换N-D坐标(如周期边界)或返回默认值(如容器外部的空值)。

要求

  • 坐标类型应模板化(应接受任何数字类型);
  • 边界条件可以动态修改。

问题:

对于具有边界条件的N-D容器,我希望在给定坐标处请求一个值,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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来接受不同类型的坐标(更不用说纯虚拟坐标)。

我猜这里有一个基本的设计缺陷,如果你能告诉我在哪里,以及如何纠正它,我将非常感激。对于问题的长度也很抱歉;这可以通过我不知道的设计(原型)模式来解决。


我想感谢@yakk的出色建议,但我想我将使用数组容器的隐式扩展来访问边界值。

这是因为我不需要一个完整的容器接口来访问可能受边界条件约束的值,而只需要一个访问方法;我应该知道在我的程序中何时需要边界条件,何时不需要。下面是一个伪代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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
        }
    }
};