我正在寻找一个可执行文件(或者一个可以嵌入到 C# 中或通过托管 C++ 嵌入到 C# 项目中的库)来为两个文件夹及其内容创建二进制差异文件,以及一个用于应用这些补丁文件以及针对 Windows 的补丁工具。
这篇SO 帖子引用了各种工具,例如bsdiff/bspatch,它已经过时了。不过,此处提供的第 3 方可执行文件在尝试时不起作用。与原始版本不兼容的另一个变体如下。不幸的是,它依赖于 bzlib 和某些 Linux 头文件,并且我无法真正在 Visual Studio 下进行相应的设置。
不管怎样,所有工具和帖子都有大约 8-10 年的历史,我想知道目前维护了哪些工具和库,我可以看看。
我想尝试使用 fp-ts 重写代码的某些部分,并考虑重构以下方法:
export const createApiServer = () => {
logger.info("Starting World Server API");
const apiServer = express()
// 3rd party middleware
.use(helmet())
.use(bodyParser.json())
.use(cors())
// Root route
.get("/", (_, result) => result.sendStatus(httpStatusCodes.OK))
// 404 - Not Found
.use((_, result) => result.sendStatus(httpStatusCodes.NOT_FOUND))
// 500 - Internal Server Error
.use(errorLoggerMiddleware)
.use(errorResponseMiddleware);
logger.verbose(`Initialized World Server API in ${process.uptime().toFixed(3)} seconds`);
return apiServer;
};
Run Code Online (Sandbox Code Playgroud)
在阅读了IO副作用类型后,我尝试按如下方式使用它:
const info = (message: string) => new IO(() => log.info(message));
const verbose = (message: string) => new …Run Code Online (Sandbox Code Playgroud) 我正在写一个游戏,现在我能够通过类及其方法实现文件系统sqlite.为了让生活更容易我已经打算写像一些功能fopen,fclose,fread,rename,等能够影子基础功能,并直接把我的给我的文件系统调用,而不是原来的一个.对于前三个功能,一切都适合我使用这些原型:
File *fopen(String _Filename, String _Mode); // i have my own optimized File struct
void fclose(File *_File);
size_t fread(String *_DstBuf, size_t _ElementSize, size_t _Count, File *_File);
这工作正常,因为我要么返回另一个结构或参数除了a File*而不是a FILE*,但重命名函数似乎有点棘手!
int rename(String _OldFilename, String _NewFilename);
这几乎是相同的原型.除了我使用std::string(typedef'ed String)比const char*!知道我怎么能说服我的编译器使用我的函数或忽略stdio-one?
我最新的项目是基于文本的RPG的开发,现在我需要一个随机数生成器,一个很好的计算器,可以在不同的情况下计算是否可以执行某些操作而不会出现问题.我们每个人都知道,基本功能std::srand和std::rand简单易用的算法来计算伪随机值.但是我希望有真实值而不是伪值.因此,我想问一下,使用比上述解决方案更好的解决方案是否会过分夸大并坚持基础; 如果没有,你会建议什么?如何实现这样一个"好的发电机"?
试着习惯F#我尝试了一些小例子,我的下一步是为逻辑计算/评估编写一些函数,现在我有了这个结构
type Expr =
| True
| False
| Not of Expr
| And of Expr * Expr
Run Code Online (Sandbox Code Playgroud)
它应该是显而易见的我想达到的目标:能够封装喜欢不同的功能Not,并And像一个计算中使用And(And(True, Not(False)), True),但目前我不明白(这是我第一次wrinting这种"复杂"的功能代码)如何使用这个结构并编写正确的方法,例如我可以编写用于评估
let evalLogic (expr : Expr) : bool =
match expr with
| True -> true
| False -> false
| _ -> false (* eval the expression which is not "atomic" *)
Run Code Online (Sandbox Code Playgroud)
然后作为一种方法
let And (left : Expr , right : Expr ) : Expr =
let value = evalLogic(left) && evalLogic(right)
match …Run Code Online (Sandbox Code Playgroud) 我使用两个辅助结构来处理智能指针和向量
template<typename T>
struct Pointer {
typedef shared_ptr<T> type;
};
template<typename T>
struct Vector {
typedef vector<T, allocator<T>> type;
};
Run Code Online (Sandbox Code Playgroud)
在这种情况下,表达是显而易见的
is_same<
vector<
shared_ptr<T>,
allocator<shared_ptr<T>>>,
Vector<
Pointer<T>::type>::type>
::value
Run Code Online (Sandbox Code Playgroud)
收益真实.但是我现在有一个模板化的函数(实际上是一个oparator),在使用Vector<Pointer<T>::type>::type或通常时处理不同vector:
// (1) General version
template<typename T>
Foo& operator&(T& object);
// (2a) Specialized version
template<typename T>
Foo& operator&(vector<shared_ptr<T>, allocator<shared_ptr<T>>>& object);
// (2b) Specialized version which does not work
template<typename T>
Foo& operator&(typename Vector<typename Pointer<T>::type>::type& object);
Run Code Online (Sandbox Code Playgroud)
在我的代码中使用(2a)时调用此运算符按预期工作.然而,当我用(2b)替换(2a)时,编译器/链接器尝试将调用与(1)匹配,这对我产生链接错误,因为(1)没有定义/对于向量有效.为什么编译器对(2a)和(2b)的处理方式不同?