我知道这是一个很常见的主题,但尽管很容易找到典型的 UB,但到目前为止我还没有找到这个变体。
所以,我试图正式引入 Pixel 对象,同时避免数据的实际副本。
这是有效的吗?
struct Pixel {
uint8_t red;
uint8_t green;
uint8_t blue;
uint8_t alpha;
};
static_assert(std::is_trivial_v<Pixel>);
Pixel* promote(std::byte* data, std::size_t count)
{
Pixel * const result = reinterpret_cast<Pixel*>(data);
while (count-- > 0) {
new (data) Pixel{
std::to_integer<uint8_t>(data[0]),
std::to_integer<uint8_t>(data[1]),
std::to_integer<uint8_t>(data[2]),
std::to_integer<uint8_t>(data[3])
};
data += sizeof(Pixel);
}
return result; // throw in a std::launder? I believe it is not mandatory here.
}
Run Code Online (Sandbox Code Playgroud)
预期使用模式,大大简化:
std::byte * buffer = getSomeImageData();
auto pixels = promote(buffer, 800*600);
// manipulate pixel data
Run Code Online (Sandbox Code Playgroud)
进一步来说:
c++ placement-new object-lifetime language-lawyer reinterpret-cast
上下文
我正在使用Django模型建模我的数据.主要模型是Article
.它包含实际内容.
然后每个Article
必须附加到一组文章.那些群体可能是a Blog
,Category
a Portfolio
或a Story
.每一个都Article
必须附在一个,而且恰好是其中之一.也就是说,无论是博客,类别还是故事.这些模型具有非常不同的领域和功能.
我想到了达到目标的三种方法(以及真正看起来错误的奖励).
选项#1:通用外键
如在django.contrib.contenttypes.fields.GenericForeignKey
.它看起来像这样:
class Category(Model):
# some fields
class Blog(Model):
# some fields
class Article(Model):
group_type = ForeignKey(ContentType)
group_id = PositiveIntegerField()
group = GenericForeignKey('group_type', 'group_id')
# some fields
Run Code Online (Sandbox Code Playgroud)
在数据库方面,这意味着模型之间实际上不存在任何关系,它们由Django强制执行.
选项#2:多重继承
使文章组全部从ArticleGroup
模型继承.这看起来像这样:
class ArticleGroup(Model):
group_type = ForeignKey(ContentType)
class Category(ArticleGroup):
# some fields
class Blog(ArticleGroup):
# some fields
class Article(Model):
group = ForeignKey(ArticleGroup)
# some fields
Run Code Online (Sandbox Code Playgroud)
在数据库方面,这创造了一个额外的表ArticleGroup
,然后Category
和 …
Ember 2.0已经不遗余力地将一切都变成了一个组件.随着可路由的组件即将推出,控制器也可能会逐步淘汰.
上下文
但是,在构建用户界面时我遇到了一个反复出现的问题,到目前为止我还没有令人满意的模式:用户界面状态.
我在做什么?
基本上,任何不属于实际数据的状态,但必须逐个对象地跟踪.在过去,过去常常将其Controllers
作为模型的代理.这种方法现在已经过时了.新方法Components
无处不在,越来越好.组件执行簿记,跟踪瞬态并且您可以恢复操作.
但是,我的典型模式是共享状态,例如带有可选项的列表.
问题
构建列表组件,具有以下要求:
问题:选择标志在哪里?
尝试
1)一切都是一个组成部分.
我将每个项目都设为子组件,比如{{my-list-item}}.该组件跟踪选择状态.问题:列表组件如何更新选择状态?
2)将状态移出子组件.
把它放在列表组件上.在项目列表旁边的单独状态数组中.优点:列表具有所需的所有状态.缺点:在列表中添加或删除项目时保持同步是一场噩梦.这意味着子组件无法访问该状态.或者也许我可以将它作为绑定值传递给它们?
3)重新引入代理.
想到它,有一种方法可以分享一些状态:把它放在模型上.好吧,不是在实际的模型上,以免污染它们与本地状态,但通过设置一个ArrayProxy将返回ObjectProxy
每个项目的一些,以保持状态.
优点:这是我设法完全实现的唯一解决方案.缺点:封装和封装物品是一件麻烦事.此外,经过几层传递,get
并且set
必须通过4 ou 5代理,我担心这将是性能问题.
此外,它不适用于mixins.如果我想抽出一些HasSelection
mixin,HasFoldableItems
mixin和Sortable
mixin,他们都需要一些状态.
回到绘图板
是否有一些我没有找到的更好的模式?
我发现了以下相关问题,但这导致我无处可寻:
我想存储一个只包含以下格式数据的字典:
{
"key1" : True,
"key2" : True,
.....
}
Run Code Online (Sandbox Code Playgroud)
换句话说,这只是一种检查密钥是否有效的快速方法。我可以通过在名为foo
的文件中存储一个 dict 来做到这一点bar.py
,然后在我的其他模块中,我可以按如下方式导入它:
from bar import foo
Run Code Online (Sandbox Code Playgroud)
或者,我可以将其保存在一个名为 的pickle 文件中bar.pickle
,然后按如下方式将其导入到文件顶部:
import pickle
with open('bar.pickle', 'rb') as f:
foo = pickle.load(f)
Run Code Online (Sandbox Code Playgroud)
哪种方法是理想且更快的方法?
我有一个非常简单的python脚本,它应该打印一个像这样传递的文件的内容:python script.py stuff.txt
.我没有得到任何输出.
这是代码:
import sys
fname = sys.argv[1]
f = open(fname, 'r')
f.read()
Run Code Online (Sandbox Code Playgroud)
从我所读到的,这应该是有效的.为什么不?