- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有 6 种 datastructure<T>
.
它们都包含覆盖 10-20 个常用函数(紫色),例如addFirst()
.
然而,一些数据结构有自己的0-5个独特的功能(粉红色)。
例如,只有 MyArray<T>
具有功能addManual(T,int)
.
在极少数情况下,一些不同类型的数据结构支持一些相同的特殊功能。
这是一个简短的片段:-
class Vector3D{};
template<class T>class MyArray{
public: void addFirst(T t){/* some code */}
/* other add / remove / query function */
public: void addManual(T t,int internalIndex){/* some code */}
};
template<class T>class MyGrid3D{
public: void addFirst(T t){/*some code */}
/* other add / remove / query function */
public: void addSpecial(T t,Vector3D gridAddress){/* some code*/}
};
到目前为止效果很好。
现在,我想通过提供接口(interface) Adapter<MyX,T,I>
来简化它的使用.
我图书馆的用户可以识别内部存储类型T
和界面I
分别地。
只要函数(紫色/粉色)的参数类型为 I
, 我会将其转换为 T
并在内部对其进行操作,就好像它具有类型 T
.
这是我的原型(prototype):-
template<template<class> class MyX,class T,class I>class Adapter{
private: T convert(I i){/* some logic */ return T();}
MyX<T> database;
public: void addFirst(I i){
database.addFirst(convert(i));
}
};
int main() {
Adapter<MyArray,int,std::string> adapter;
adapter.addFirst(std::string("5.0f"));
std::cout<<"compiled OK";
return 0;
}
效果很好( coliru demo ),但不包括特殊功能(紫色),例如addManual()
或 addSpecial()
.
什么是设计模式/C++ 魔法 Adapter
支持那些功能?
这是我的三个糟糕的解决方案:-
为每种类型的数据结构创建许多适配器类,例如AdapterMyArray<T,I>
和 AdapterMyGrid3D<T,I>
.
通过继承改进第一个解决方案,例如AdapterMyArray<T,I>
和 AdapterMyGrid3D<T,I>
源自 AdapterBase<T,I>
.
检查 MyX
的类型并使用 std::enable_if
启用这些特殊功能的实例化。
我觉得我所有的解决方案都过于手动,这会导致一些可维护性问题。
编辑: Yakk 的解决方案很好,但我仍然怀疑是否有更好的解决方案。
最佳答案
CRTP。
有Adapter_addFirst
Adapter_addManual
等等 CRTP 助手。他们使用 CRTP 访问 database<T>
并实现他们的一个(或一组)功能。
Adapter
查询 database
或 database<T>
通过 traits 类助手来确定哪个 CRTP Adapter_*
它应该(公开地)继承自。
template<class D, class I>
class Adapter_addFirst {
D* self() { return static_cast<D*>(this); }
D const* self() const { return static_cast<D*>(this); }
public:
void addFirst(I i){
self()->database.addFirst(self()->convert(i));
}
};
template<std::size_t I>
struct empty_t {};
template<template<class> class MyX,class T,class I>
class Adapter:
public std::conditional_t<true, Adapter_addFirst<Adapter<MyX, T, I>, I>, empty_t<0>>
{
friend struct Adapter_addFirst<Adapter<MyX, T, I>, I>;
private:
T convert(I i){/* some logic */ return T();}
MyX<T> database;
};
哪里true
替换为“我应该添加 First”的测试。
对每个方法重复。
Dispatch 是静态的,方法只在应有的情况下存在,一切都符合标准。
您可以通过类型上的标签、类型特征或什至是调用 std::declval<MyX<T>&>().addManual( std::declval<T const&>() )
的 SFINAE 测试来测试“我应该添加手册”吗? .对于 SFINAE 案例,请参阅 can_apply或等效的。
关于c++ - 封装多种类型的 Datastructure<T> 并公开它们的所有功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43914244/
我的类有很多方法,其中一些方法是用注释标记的。每个方法可以有很多注释,例如 @StepAnnotation(name="Action1" ) @SequenceAnnotation(name="tra
是否有关于小型 集合(例如 1-100 个元素)的各种 Java 集合实现的性能的任何好的引用,或者有人可以告诉我更多相关信息吗? O(1) vs O(log n) 的故事与这些大小几乎无关,但由于我
我正在尝试基于已经存在的数据结构(我无法修改并且它本身不是图形)构建图形数据结构。我想我对如何构建与图形本身有关的大部分结构有所了解,但现在我必须引用原始数据结构来获得一个小的“比较”功能,并且很难对
我有 6 种 datastructure . 它们都包含覆盖 10-20 个常用函数(紫色),例如addFirst() . 然而,一些数据结构有自己的0-5个独特的功能(粉红色)。 例如,只有 MyA
我必须在 Java 程序中存储大量单词 (+200k),并且我想快速访问它们。我只需要知道给定的单词是否属于我的“词典”。我不需要像 这样的一对.如果可能的话,我正在标准库中搜索解决方案。 PS:也
本文整理了Java中us.ihmc.robotics.dataStructures.registry.YoVariableRegistry类的一些代码示例,展示了YoVariableRegistry类
本文整理了Java中us.ihmc.robotics.dataStructures.variable.YoVariable类的一些代码示例,展示了YoVariable类的具体用法。这些代码示例主要来源
问题之前的一些背景。 想象文件 FileA 有大约 50 个不同类型的字段。我尝试使用一个服务程序,而不是所有程序都使用该文件,因此该文件只能由该服务程序访问。然后,调用该服务的程序将接收基于文件结构
我正在使用 Django 1.10 + celery==4.0.0rc3 + django-celery 并提交 @79d9689b62db3d54ebd0346e00287f91785f6355 。
我看过很多关于这个主题的问题,但没有一个能涵盖我的情况。 我正在构建一个基于 5 个类的 ACL 模块: 角色 特权 组 Wrapper(猜猜它做了什么..)Privilege、Role 和 Grou
我正在尝试安装和使用 DataStructures 包,但它似乎不起作用;或者我错过了一些东西。 Pkg.init() Pkg.status() Pkg.add("DataStructures") P
关于 SO 上的堆栈的问题,终于!我的一生都让我走到了这一步。 所以我需要将我制作的一些相当大的自定义数据结构合并到一个堆栈中。我决定编写一个仅包含一个整数值的最小堆栈结构。这里是 - MODULE
如何优化嵌套 if block 以进行快速比较。下面是我的代码,它比较两个不同的 java 对象。我有一个成员变量,它也具有位于 if block 之一中的模式。 listOfFilters 是 Ma
问题描述如下:由于你是 Monk 最喜欢的学生,因此有 N 个过程需要你(被选中的人)完成。所有进程都分配有一个唯一的编号,从 1 到 N。 现在,你有两件事:- 调用所有进程的调用顺序。- 所有进程
本文整理了Java中us.ihmc.robotics.dataStructures.registry.YoVariableRegistry.getAllVariables()方法的一些代码示例,展示了
本文整理了Java中us.ihmc.robotics.dataStructures.registry.YoVariableRegistry.getChildren()方法的一些代码示例,展示了YoVa
本文整理了Java中us.ihmc.robotics.dataStructures.registry.YoVariableRegistry.getVariable()方法的一些代码示例,展示了YoVa
本文整理了Java中us.ihmc.robotics.dataStructures.registry.YoVariableRegistry.getName()方法的一些代码示例,展示了YoVariab
本文整理了Java中us.ihmc.robotics.dataStructures.registry.YoVariableRegistry.registerVariable()方法的一些代码示例,展示
本文整理了Java中us.ihmc.robotics.dataStructures.registry.YoVariableRegistry.getAllVariablesInThisListOnly(
我是一名优秀的程序员,十分优秀!