在ostream类C++的提供了许多默认重载operator<<,但他们不是以同样的方式定义的所有.
的重载为char类型,string类型和右值流被定义为自由namespace-scope功能如:
namespace std {
ostream &operator<<(ostream &os, char c);
}
Run Code Online (Sandbox Code Playgroud)
虽然算术类型和流操作符的重载streambuf被定义为成员函数,std::ostream例如:
namespace std {
ostream &ostream::operator<<(int val);
}
Run Code Online (Sandbox Code Playgroud)
有这种区别的原因吗?我理解对这些运算符重载的调用操作稍有不同(即自由namespace-scope定义的ADL ),因此我认为出于优化目的,可能会优先考虑特定类型的运算符重载.但是这里std::ostream对不同类型使用两种类型的定义.这允许的语义或实现优化是否有任何优势?
我遇到过我可以访问方法的应用程序:
void AttachCallback(int event, std::functional<void(int)> cb);
Run Code Online (Sandbox Code Playgroud)
这让我可以附加一个回调cb事件event.我还有几个类需要将回调附加到其构造函数中的几个事件,并为它们绑定的每个事件实现回调.因此,首先想到的实现看起来像:
class MyClass {
public:
MyClass() {
AttachCallback(0, [this](int value) { cb0(value); });
AttachCallback(2, [this](int value) { cb2(value); });
// ... as necessary
}
private:
void cb0(int value) { /*... callback for event 0 ...*/ }
void cb2(int value) { /*... callback for event 2 ...*/ }
// ... as necessary
};
Run Code Online (Sandbox Code Playgroud)
但是,由于我最近一直在玩模板很多,我想知道我是否可以创建一个模板化的纯虚拟类来监听给定的事件并使用它如下:
template<const int EVENT>
class ListensToEvent {
public:
virtual ~ListensToEvent() = default;
protected:
ListensToEvent() {
AttachCallback(EVENT, [this](int …Run Code Online (Sandbox Code Playgroud) 我知道使用内联汇编解决以下问题是个坏主意.我目前正在学习内联汇编作为linux内核类的一部分,这是该类的一个赋值的一部分.
下面的开头是一段几乎正确的代码片段,而不是段错误.它是一个函数,它将src从索引处开始并在索引处s_idx结束(排他地)的子字符串复制e_idx到dest仅使用内联汇编的预分配.
static inline char *asm_sub_str(char *dest, char *src, int s_idx, int e_idx) {
asm("addq %q2, %%rsi;" /* Add start index to src (ptrs are 64-bit) */
"subl %k2, %%ecx;" /* Get length of substr as e - s (int is 32-bit) */
"cld;" /* Clear direction bit (force increment) */
"rep movsb;" /* Move %ecx bytes of str at %esi into str at %edi */
: /* No Ouputs …Run Code Online (Sandbox Code Playgroud)