我正在为CRI Middleware的ROFS(见维基百科)等视频游戏编写某种虚拟文件系统库.我对图书馆的意图是提供访问我开发的游戏资源的自然方法,它存储可执行文件中嵌入的一些数据,一些存储在媒体上,一些存储在本地用户的硬盘上(首选项,保存游戏文件等) .
访问这些资源应该像打电话一样简单
std::auto_ptr<std::istream> defaultConfigIStream(
fslib.inputStream("self://defaultConfig.ini"));
std::auto_ptr<std::ostream> defaultConfigOStream(
fslib.outputStream("localappdata://config.ini"));
// Copies default configuration to local user's appdata folder
defaultConfigIStream >> defaultConfigOStream;
Run Code Online (Sandbox Code Playgroud)
实际的做事方式实际上是不同的,另一个抽象层用于后台加载,但这在这里并不重要.
我想知道的是,我怎么能返回那个auto_ptr<>(或者unique_ptr<>你选择),因为当它被破坏时,与它std::streambuf<>相关联的东西std::[i/o]stream<>不被它删除.
我正在考虑std::[i/o]stream<>不建议在构建时传递给它的streambuf的所有权,因为构造函数不提供所有权语义的转移,Apache的STDCXX引用没有提到所有权的转换(我找不到任何stdlib引用)在网上).
我有什么替代品?我不妨返回一个共享指针并继续观察它,直到FSlib管理器保留共享指针的唯一副本,在这种情况下它会破坏它的唯一副本以及streambuf.考虑到图书馆的组织模式,这是切实可行的,但对于这个问题,这不是很优雅也不高效.
我试过看看Boost.Iostreams,但看起来事情对我来说更糟糕,因为流本身的设备类型强烈附加到它们的类型(流的设备必须在其模板参数中定义) ).这个问题似乎使得我的库使用Boost.Iostreams是不可行的,因为它需要抽象出流的具体"源/接收器"实现,以便流可以无缝地用于打开位于可执行文件本身内的文件,例如,在系统文件系统的文件内或存档类型文件中.
我可以写一个处理这些问题的容器类,但我宁愿更干净地做(也就是刚刚返回流;这就是它应该需要的全部!;).
建议?
我想知道在现代网络浏览器上是否有一种可靠的方法可以检测文件回流和/或重新绘制,或者是否有任何迫切需要这样的东西可能会将其置于W3规范中.
我还想知道如果使用特定于供应商的技巧(例如Mozilla显然有一个MozAfterRepaint事件),它是如何完成的,如果它不可能以标准或跨浏览器的方式实现.
谢谢.
我面临着我的C++库设计的问题.它是一个用于读取流的库,支持我在其他"流"实现中找不到的功能.为什么我决定开始写它并不重要.关键是我有一个流类,它通过多重继承提供两个重要的行为:可共享性和可搜索性.
可共享流是具有shareBlock(size_t length)方法的流,该方法返回与其父流共享资源的新流(例如,使用父流使用的相同内存块).可搜索的流是那些......好的,可寻找的.通过方法seek(),这些类可以寻找流中的给定点.并非所有库的流都是可共享和/或可搜索的.
提供搜索和共享资源实现的流类继承了名为Seekable和Shareable的接口类.这一切都很好,如果我知道有这么一个流的类型,但是,有时候,我会想一个函数接受这样的说法,仅仅满足的是可查找和共享,同时质量流,不管是哪个实际上流类它是.我可以创建另一个继承Seekable和Shareable并且引用该类型的类,但是我必须使我的类既可以从该类继承,又可以共享.如果要添加更多类似的"行为类",我需要在代码中的每个地方进行一些修改,很快就会导致无法维护的代码.有没有办法解决这个难题?如果没有,那么我绝对会明白为什么人们不满足于多重继承.它几乎完成了这项工作,但是,就在那时,它没有:D
任何帮助表示赞赏.
- 第二次编辑,首选问题解决 -
起初我认为Managu的解决方案将是我的首选.然而,Matthieu M.带来了另一个我更喜欢Managu的:使用boost::enable_if<>.如果BOOST_MPL_ASSERT制作的消息不那么令人毛骨悚然,我想使用Managu的解决方案.如果有任何方法可以创建有指导性的编译时错误消息,我肯定会这样做.但是,正如我所说,可用的方法产生令人毛骨悚然的消息.因此,我更喜欢在boost::enable_if<>条件不满足时产生的(更多)较少的指导性但更清晰的信息.
我已经创建了一些宏来简化任务来编写模板函数,这些函数接受继承select类类型的参数,在这里它们是:
// SonettoEnableIfDerivedMacros.h
#ifndef SONETTO_ENABLEIFDERIVEDMACROS_H
#define SONETTO_ENABLEIFDERIVEDMACROS_H
#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/array/elem.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/and.hpp>
#include <boost/type_traits/is_base_and_derived.hpp>
#include <boost/utility/enable_if.hpp>
/*
For each (TemplateArgument,DerivedClassType) preprocessor tuple,
expand: `boost::is_base_and_derived<DerivedClassType,TemplateArgument>,'
*/
#define SONETTO_ENABLE_IF_DERIVED_EXPAND_CONDITION(z,n,data) \
boost::is_base_and_derived<BOOST_PP_TUPLE_ELEM(2,1,BOOST_PP_ARRAY_ELEM(n,data)), \
BOOST_PP_TUPLE_ELEM(2,0,BOOST_PP_ARRAY_ELEM(n,data))>,
/*
ReturnType: Return type of the function
DerivationsArray: Boost.Preprocessor array containing tuples in the form
(TemplateArgument,DerivedClassType) (see
SONETTO_ENABLE_IF_DERIVED_EXPAND_CONDITION)
Expands:
typename boost::enable_if<
boost::mpl::and_<
boost::is_base_and_derived<DerivedClassType,TemplateArgument>,
... …Run Code Online (Sandbox Code Playgroud) 我想知道与一个相同的boost :: function调用相比,单继承虚函数调用的速度有多快.它们的性能几乎相同,还是boost :: function慢?
我知道性能可能因情况而异,但是,作为一般规则,哪个更快,哪个程度如此之大?
谢谢,Guilherme
- 编辑
KennyTM的测试对我来说足够令人信服.对于我自己的目的,boost :: function似乎并不比vcall慢得多.谢谢.
对于大多数人来说,这些问题听起来可能非常深奥,但我真的很想知道这些问题.
我想知道FPGA需要多长时间才能重新配置,从建模电路断电到新设备到位和运行的时间.
我知道Place - & - Route是一个代价高昂的过程,但这是因为P&R工具必须决定放置组件的位置以及如何布置它们.
考虑到P&R分析已经完成,剩下的就是重新配置FPGA:这本身就是一个缓慢的过程吗?可以每秒进行数百次或数千次吗?
对于我很好奇的这种可能性有几个含义.在名称2中,它可以允许我们为多个并发"客户端"提供FPGA(就像GPU能够为多个不同的程序渲染内容一样),或者提供极其微调的电路,用于长时间运算的过程.高度异步处理的明确但很多处理阶段(想想:复杂的Haskell程序).
我想问的一件事是,FPGA是否可以实时部分重新配置,而模拟电路是供电和运行的,只要重新配置的部件当然是断电的.
这种可能性也会产生一些有趣的含义,例如允许实时可重构总线,神经网络的硬件仿真等.
这些东西现在正在广泛研究吗?他们将来有多大可能被研究?
我担心,通过省略,包含数据库密码或会话密钥等秘密的模块可以包含在WebPack或Browserify捆绑包中.
即使我不直接导入这些模块,我也可能不小心从客户端入口点模块间接导入它们.
有没有办法将这些文件列入黑名单,以便这些捆绑包拒绝捆绑它们?尽可能愿意遵循可避免此类问题的最佳实践,但拥有这样一个安全网会很好.
我正在开发一个由许多独立子系统组成的系统.其中两个子系统是Window和GraphicsAdapter子系统.
GraphicsAdapter需要一个低级窗口句柄(HWND或X11窗口句柄,具体取决于操作系统),而Window子系统是一种抽象这些特定于操作系统的API的方法.
如果Window子系统允许访问低级API句柄,那么封装将有很大的可能性被破坏.
如果它允许窗口全屏显示并返回,但是必须触发事件警告系统有关这些更改,并且低级别句柄用于在不知情的情况下切换到全屏?
如何确保把手从Window子系统安全地传送到GraphicsAdapter而不被滥用,并且仍然足够灵活,以便稍后可以添加其他子系统,如GraphicsAdapter,同时保持类型安全?
有没有办法以一种方式封装句柄Direct3D和OpenGL可以从句柄访问正常工作?
- 编辑
另外,从一个子系统到另一个子系统安全地携带手柄,例如,知道子系统可以由不同的编码器团队编写,有没有办法提醒他们手柄的使用方式?
注释是显而易见的选择,但编译器强制执行的是我真正想要的...
我需要实现一组在FeathersJS应用程序上执行非常自定义/复杂操作的路由.
其中一条路线是/Category/disableExclusiveContentsOf/:id.它针对六个数据库表运行查询,以查找与该类别相关的行:id.我绝对不能使用FeathersJS提供的查询抽象.然后,它使用FeathersJS的"本地"API来更新我找到的行,以便向客户端触发数据更新事件.
但是,如果我单独使用Express实现路由,则Feathers身份验证/授权挂钩将不会运行,因此端点将不受保护,这是一项要求.
我如何在FeathersJS应用程序中容纳这些东西?
我无法弄清楚我的代码有什么问题.Boost的模板让我变得疯狂!我不能在这一切中做出正面或反面,所以我不得不问.
这有什么问题?
#include <iostream>
#include <boost/lambda/lambda.hpp>
#include <boost/spirit/include/qi.hpp>
void parsePathTest(const std::string &path)
{
namespace lambda = boost::lambda;
using namespace boost::spirit;
const std::string permitted = "._\\-#@a-zA-Z0-9";
const std::string physicalPermitted = permitted + "/\\\\";
const std::string archivedPermitted = permitted + ":{}";
std::string physical,archived;
// avoids non-const reference to rvalue
std::string::const_iterator begin = path.begin(),end = path.end();
// splits a string like "some/nice-path/while_checking:permitted#symbols.bin"
// as physical = "some/nice-path/while_checking"
// and archived = "permitted#symbols.bin" (if this portion exists)
// I could barely find out the …Run Code Online (Sandbox Code Playgroud) 我一直这样做是为了在Linux下同步读取整个stdin数据:
var buffer = fs.readFileSync('/dev/stdin');
Run Code Online (Sandbox Code Playgroud)
这显然不适用于Windows,因为没有/ dev/stdin文件.我能做些什么来实现同样的目标?
c++ ×5
boost-spirit ×1
c++11 ×1
direct3d ×1
feathersjs ×1
fpga ×1
html ×1
hwnd ×1
iostream ×1
javascript ×1
llvm ×1
node.js ×1
opengl ×1
performance ×1
real-time ×1
reflow ×1
repaint ×1
secret-key ×1
stdin ×1
synchronous ×1
webpack ×1
windows ×1