- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
最近我一直在考虑如何设计一个特定的软件,有一次我制作了以下部分:
template <typename ... Mixins>
class Foo : public virtual Mixins... {
/* ... */
};
我的想法是能够根据用户的需要使用额外的属性或行为来扩充基本类。假设一个应用程序需要使用带有标识号的 Foo
。也许其他一些应用程序需要能够用颜色来谈论 Foo
。这些需求可以通过添加以下类来满足:
class HasID {
int m_id = -1;
public:
int getID() { return m_id; }
void assignID(int id) { m_id = id; }
};
class HasColor {
public:
int color = 0;
};
我对这段代码的两个问题如下:
这是一个额外的示例,展示了打印增强类对象的详细信息的可能性。
打印函数:
// Default printBase
template <typename Base>
void printBase(std::ostream& out, Base& x) {}
// printBase for HasID
template <>
void printBase(std::ostream& out, HasID& x) {
out << ", ID=" << x.getID();
}
// printBase for HasColor
template <>
void printBase(std::ostream& out, HasColor& x) {
out << ", color=" << x.color;
}
// Recursive step of printBases
template <typename Derived, typename Base, typename ... Bases>
void printBases(std::ostream& out, Derived& x, Base& y) {
printBase(out, y);
printBases<Derived, Bases...>(out, x, x);
}
// Base case of printBases
template <typename Derived>
void printBases(std::ostream& out, Derived& x, Derived& y) {}
// ostream operator
template <typename ... Mixins>
std::ostream& operator<<(std::ostream& out, Foo<Mixins...>& x) {
out << "<Foo";
printBases<Foo<Mixins...>, Mixins...>(out, x, x);
return out << '>';
}
主要内容:
int main()
{
Foo<> plainFoo;
Foo<HasID> fooWithID;
fooWithID.assignID(42);
Foo<HasID, HasColor> multiTalentedFoo;
multiTalentedFoo.assignID(1234);
multiTalentedFoo.color = 0xff0000;
std::cout
<< plainFoo << '\n'
<< fooWithID << '\n'
<< multiTalentedFoo << '\n';
}
输出:
<Foo>
<Foo, ID=42>
<Foo, ID=1234, color=16711680>
最佳答案
My two questions about this code are as follows:
Does this particular pattern have a name?
What are the uses and drawbacks of using templates like this?
CRTP“奇怪的重复模板模式”或有时也称为“mixin”。
https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern
当网络知道这种模式/习语时,我们真的要在这里再次讨论缺点吗?讨论得够多了:-)
https://softwareengineering.stackexchange.com/questions/123886/is-crtp-used-much-and-why-it-is-isnt
本文http://www.drdobbs.com/building-more-flexible-types-with-mixins/184402056备注:
The biggest drawback of the CRTP technique is that constructors aren't inherited. This means that if you use an initializing constructor in your implementation class, every extension will have to have an appropriate initializing constructor. This causes the extensions to be more restricted and, as such, less useful.
对于 c++14 来说,这不再是正确的,你有很好的机会用可变参数模板和基类的构造函数调用链来消除这个论点。继承和委派构造函数也有助于实现这一目的。
与所有模板一样,您必须记住每个实例化都是一个新类型,这会导致您的可执行文件中出现大量代码重复。我经常使用这种模式并接受成本。另一种方法是手工制作可执行文件大小不少的代码。你必须为你需要的东西付费。
关于c++ - 指定类基类的 C++ 模板参数的用途和缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38605329/
XML可以应用于 WEB 开发的许多方面,常用于简化数据的存储和共享 XML 把数据从 HTML 分离 现在的HTML 文档一般都是显示动态数据,每当数据改变时将花费大量的时间来编辑 HTML
在类(class)(方案)中,我们最近学习了允许函数接受任意数量参数的语法,例如; (define len (lambda args (length args))) >(len 1 2 3
在 redis-cli 中执行 info 命令时,会列出与该服务器相关的所有信息。 “evicted_keys”的目的是什么? 最佳答案 Redis 可以配置为根据需要自动清除键。如果这样配置,red
golang 空结构体 struct{} 可以用来节省内存 ? 1
有人可以解释一下资源文件夹中的 Info.plist 是什么吗?我如何在我的应用程序中使用它?提前致谢。 最佳答案 您可以在Info.plist文件中为所有类型的设备指定不同的常规资源和应用程序配置,
我需要减小可执行文件的大小,并且经常在我的可执行文件中将某些“不必要的” uses占用一定的大小。 例如: Unit1连接到Unit2,但是两个单元的导入为“ System.SysUtils”。 然后
我是 OOP 的新手。虽然我了解多态是什么,但我无法真正使用它。我可以有不同名称的函数。为什么我应该尝试在我的应用程序中实现多态性。 最佳答案 在严格类型化的语言中,多态性对于拥有不同类型对象的列表/
Possible Duplicate: What is the difference between a delegate and events? Possible Duplicate: Differ
这个问题在这里已经有了答案: Custom index.html javadoc page? (2 个答案) 关闭 7 年前。 我使用的是eclipse。一般情况下我们可以使用javadoc.exe
你能解释一下吗ValidateAntiForgeryToken目的并向我展示有关 MVC 4 中的 ValidateAntiForgeryToken 的示例? 我找不到任何解释此属性的示例? 最佳答案
我正在学习 RxSwift 并试图了解 Observable 和 PublishSubject aka Sequence 之间的主要区别。 据我了解,Sequences/PublishesSubjec
有时有人说,在使用 Azure 表时,实际上存在第三个关键分区数据 - 表名称本身。 我在执行分段查询时注意到 TableContinuationToken 有一个 NextTableName 属性。
在Apple提供的aurioTouch项目中,听说在performRender()函数下的AudioController文件中的AudioBufferList ioData携带了mic到音频播放器的音
MSDN 文档没有详细解释它的用途。 由于它是可选的,我几乎假设它类似于某种元数据。 我现在如何看待它,我想用它来为特定用户指定缓存,例如: new CacheItem(key: "keyName",
我正在学习 browserify,我正在尝试用它做两件基本的事情: 转换(通过 shim)非 CommonJS 模块以实现易用性和依赖跟踪 捆绑项目特定的库 我找到了一个工作流程,说明如何使用 Gul
我通过按 CTRL + C 访问 eix 1.8.2 的 Break 菜单。它看起来像这样: BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
在 codeLabs 教程(Android - Kotlin - Room with a View)中,他们使用“viewModelScope.launch(Dispatchers.IO)”来调用插入
我通过按 CTRL + C 访问 eix 1.8.2 的 Break 菜单。它看起来像这样: BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
请耐心等待,因为我没有太多地使用压缩算法,所以这对你们中的一些人来说可能是显而易见的。当某些流媒体视频开始滞后时,我总是注意到这一点。当我看到这个问题时我才意识到我很好奇: Twitter image
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 3 年前。 Improv
我是一名优秀的程序员,十分优秀!