这是另一个虚拟模板解决方案
Yet another virtual template workaround
对不起,这是一个流行的主题(例如在这里),但我找不到一个合适的解决方案来解决我的问题。显示代码会太长,令人困惑,所以我只是显示peudo-code;这是一个关于设计的问题,我正在寻找一个适用于c++(11)的模式。
目标:我正在处理多维数组(例如,包含向量场的4D数组),我想访问具有n-D坐标和动态边界条件的数组元素。
对象:
- 数组:在内存中以1D数组的形式包含数据,并且重载下标(
value_type operator[] (unsigned)
); - Indexer:存储n-D数组的维度,并将n-D坐标转换为1D索引(
unsigned operator() (Coordinates)
); - 边界:转换n-D坐标(如周期边界)或返回默认值(如容器外的空值)。
- 坐标类型应该被模板化(任何数字类型都可以接受);
- 边界条件可以动态修改。
问题:
给定一个带有边界条件的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
来接受不同类型的坐标(更不能定义纯虚的)。
我猜这里有一个基本的设计缺陷,如果你能告诉我在哪里,最好是如何纠正它,我将非常感激。很抱歉问题太长了;这可以通过我不知道的设计(原型)模式来解决。
我要感谢@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
}
}
};
相关文章:
- 运行同一解决方案的另一个项目的项目
- Project Euler问题4的错误解决方案
- 计算每个节点的树高,帮助我解释这个代码解决方案
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- visual c++,如何获取解决方案目录中的代码
- 有没有办法在远程设备上打开和编辑visual Studio 2017解决方案
- C++Matching Brackets 2解决方案不起作用
- 在 ubuntu3 上C++ goto 定义有什么解决方案吗16.04?
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的固定时间步长与增量时间和插值的解决方案是错误的吗?
- 无法在问题解决方案中执行输出逻辑
- 最大的回文产品 - 程序未运行,编写解决方案但无法理解问题
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- 在一个解决方案中针对第三方静态库 (Creo) 的不同版本(版本)进行构建
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- N-queen问题:无法弄清楚为什么我的解决方案不起作用
- 这是另一个虚拟模板解决方案
- 寻找c++成员函数覆盖(非虚拟)的解决方案
- 虚拟模板解决方案