我已经使用了一些非常大规模的系统,从未见过所需的订单,但最近遇到了它.STL或STD库甚至Boost是否存在某些包含必须按特定顺序排列的情况?
背景:我的最新项目不能使用大型图书馆,这让我感到很难过.有几件事情,我想从任何图书馆有,如缺少的功能addClass
,hasClass
,removeClass
,兼容addEventListener
,等等.所以我创建了一个小东西,我想一些其他的时间了一些意见,但我有一个设置它的方式有点麻烦.
为了方便使用,我希望一个对象在创建时返回自己的新实例.
鉴于:
$ = function() {
this.name = "levi";
return this;
};
console.log($());
Run Code Online (Sandbox Code Playgroud)
我们得到DOMWindow而不是$
因为this
JavaScript 中的古怪性质. 对我来说更奇怪的是,console.log(new $().name)
正确地返回"levi".如果this
绑定到窗口,为什么对象正确获取值?.我们可以添加新的console.log(new $())
,它的工作原理.但是,我不想每次都写新的.所以我尝试过:
$ = function() {
var obj = function() {
this.name = "levi";
};
return new obj();
};
console.log($());
Run Code Online (Sandbox Code Playgroud)
这给了我想要的东西,但是将对象包装在创建它的函数中似乎没有必要.更进一步,返回的对象obj
,而不是$
.比较测试将失败.
还有什么其他方法可以做到这一点?有更优雅的解决方案吗?我对重新思考整个过程没有任何疑虑.我认为自己非常擅长使用JavaScript,但创建新的JavaScript是我非常新的.
有没有人看到以下解决方案有什么问题?
$a = function() {};
$ = function() {
if (!(this instanceof $)) …
Run Code Online (Sandbox Code Playgroud) 包含标准的大量C++库允许您调整对象以便在库中使用.选择通常在成员函数或同一名称空间中的自由函数之间.
我想知道函数和构造库代码用于调用一个调用这个"扩展"函数之一的调用,我知道这个决定必须在编译期间进行,并涉及模板.以下运行时伪代码不可能/无意义,原因超出了本问题的范围.
if Class A has member function with signature FunctionSignature
choose &A.functionSignature(...)
else if NamespaceOfClassA has free function freeFunctionSignature
choose freeFunctionSignature(...)
else
throw "no valid extension function was provided"
Run Code Online (Sandbox Code Playgroud)
上面的代码看起来像运行时代码:/.那么,库如何找出一个类所在的命名空间,它如何检测这三个条件,还有哪些需要避免的陷阱.
我的问题的动机是让我能够在库中找到调度块,并能够在我自己的代码中使用这些构造.所以,详细的答案将有所帮助.
!!赢得胜利!
好的,根据Steve(和评论)的答案,ADL和SFINAE是在编译时连接调度的关键结构.我的头部是ADL(原始)和SFINAE(再次是粗鲁的).但我不知道他们是如何以我认为应该的方式共同组织的.
我想看一个如何将这两个结构组合在一起的说明性示例,以便库可以在编译时选择是在对象中调用用户提供的成员函数,还是在同一对象的命名空间中提供的用户提供的自由函数.这应该只使用上面的两个构造来完成,没有任何类型的运行时分派.
让我们说有问题的对象被调用NS::Car
,并且这个对象需要提供MoveForward(int units)
作为c的成员函数的行为.如果要从对象的命名空间中拾取行为,它可能看起来像MoveForward(const Car & car_, int units)
.让我们定义想要分派的函数mover(NS::direction d, const NS::vehicle & v_)
,其中direction是一个枚举,而v_是一个基类NS::car
.
我正在查看Java 8的新日期时间包的教程.在关于DayOfWeek
和Month
枚举的页面上,它表示DayOfMonth
枚举从星期一到星期日.这是为什么?我使用的每个其他系统(包括.NET)都在周日开始.
考虑到变化是源兼容的,通常应该选择哪种解决方案?
这个
object Foo {
val Bar = new Baz(42, "The answer", true)
}
Run Code Online (Sandbox Code Playgroud)
或这个?
object Foo {
object Bar extends Baz(42, "The answer", true)
}
Run Code Online (Sandbox Code Playgroud) 为什么Microsoft的COM头文件命名为Unknwn.h
,而不是Unknown.h
?这是错误印刷,还是有这种命名的客观原因?
通常,给定某种类型T
,要实现复制和移动赋值,需要两个函数
T& operator=(T&&) { ... }
T& operator=(const T&) { ... }
Run Code Online (Sandbox Code Playgroud)
最近,我逐渐意识到单一的就足够了
T& operator=(T v) {
swap(v);
return *this;
}
Run Code Online (Sandbox Code Playgroud)
此版本利用了复制/移动构造函数.赋值是复制还是移动取决于v
构造方式.这个版本甚至可能比第一个版本更快,因为pass-by-value允许更多的空间用于编译器优化[1].那么,即使标准库使用它,第一个版本优于第二个版本的优势是什么?
[1]我想这解释了为什么标签和函数对象在标准库中按值传递.
由于最大大小不依赖于特定std::vector
对象,我想它应该是一个静态方法.但是,标准原型仍然是非静态的,我无法弄清楚原因.从逻辑上讲,应该在创建任何std::vector
对象之前检查最大大小.
请注意,这个问题与此基本上不同constexpr
.
当我们通过实现Runnable并将其传递给Thread构造函数来实现相同的功能时,允许用户通过扩展Thread类来创建线程的本质是什么.
所以我知道,当使用$.fn.each
,$.fn.bind
等等,这是一个标准的this
链接回调是一个DOM元素中jQuery的关键字.
我知道在我的开发中至少我通常希望将DOM元素包装在一个jQuery集中 - 我最终会做90%的时间var $this = $(this)
.我确信他们为什么选择绑定到未包装的元素有一个很好的(可能基于性能的)理由,但是有人知道它到底是什么吗?
这是我觉得知道答案的那些事情之一可能打开了更深层次理解图书馆和语言的大门.