gpt4 book ai didi

c++ - 另一个虚拟模板解决方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:52:59 26 4
gpt4 key购买 nike

抱歉,这是一个热门话题(例如 here ),但我找不到合适的解决方案来解决我的问题。显示代码会太长且令人困惑,所以我只显示伪代码;这是一个关于设计的问题,我正在寻找适用于 C++(11) 的模式。

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

对象:

  • 数组:将数据作为一维数组存储在内存中并重载下标 (value_type operator[] (unsigned));
  • Indexer:存储n维数组的维度,并将n维坐标转换为一维索引(unsigned operator() (Coordinates));
  • 边界:转换 n 维坐标(如周期性边界)或返回默认值(例如,容器外的空值)。

要求

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

问题:

给定一个带有边界条件的 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;
}

}

我无法解决的问题是:如果边界是动态设置的,它的类型不能是模板值,所以它需要是一个指向边界接口(interface)的指针。然而,这个接口(interface)不能定义一个虚拟模板方法transform来接受不同类型的坐标(更不用说纯虚拟的了)。

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

最佳答案

我要感谢@Yakk 提出的绝妙建议,但我想我将对我的数组容器进行隐式扩展以访问边界值。

这是因为当我想访问可能受边界条件影响的值时,我不需要一个完整的容器接口(interface),而只是一个访问方法;我应该知道什么时候我的程序需要边界条件,什么时候不需要。这是一个伪代码:

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
}
}
};

关于c++ - 另一个虚拟模板解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25120459/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com