相关疑难解决方法(0)

如何重载std :: swap()

std::swap()在排序甚至分配期间被许多std容器(例如std::liststd::vector)使用.

但是std实现swap()非常普遍,而且对于自定义类型来说效率很低.

因此,通过std::swap()使用自定义类型特定实现进行重载可以获得效率.但是如何实现它以便std容器使用它?

c++ optimization performance stl c++-faq

112
推荐指数
4
解决办法
3万
查看次数

如何重载ostream操作符<<以使其在C++中与log4cxx一起使用?

假设我有一个类A和一个运算符<<声明如下:

// A.h
class A
{
    // A stuff
};
std::ostream& operator<<(std::ostream& os, const A& a);
Run Code Online (Sandbox Code Playgroud)

在其他地方我用A记录器:

LoggerPtr logger(LogManager::getLogger("ThisObject"));
A a;
LOG4CXX_INFO(logger, "A: " << a);
Run Code Online (Sandbox Code Playgroud)

编译器抱怨:二进制'<<':找不到运算符,它采用类型'const A'的右手操作数(或者没有可接受的转换)D:\ dev\cpp\lib\apache-log4cxx\log4cxx\include\log4cxx\helpers\messagebuffer.h 190

这个错误带我去声明operator<<:

// messagebuffer.h
template<class V>
std::basic_ostream<char>& operator<<(CharMessageBuffer& os, const V& val) {
    return ((std::basic_ostream<char>&) os) << val;
}
Run Code Online (Sandbox Code Playgroud)

LOG4XX_INFO 宏扩展为:

#define LOG4CXX_INFO(logger, message) { \
    if (logger->isInfoEnabled()) {\
       ::log4cxx::helpers::MessageBuffer oss_; \
       logger->forcedLog(::log4cxx::Level::getInfo(), oss_.str(oss_ << message), LOG4CXX_LOCATION); }}
Run Code Online (Sandbox Code Playgroud)

MessageBuffer "定义"此运算符:

// messagebuffer.h
template<class V>
std::ostream& operator<<(MessageBuffer& os, const V& …
Run Code Online (Sandbox Code Playgroud)

c++ operator-overloading log4cxx

10
推荐指数
1
解决办法
1683
查看次数

为什么发明了依赖于参数的查找?

为什么发明了依赖于参数的查找(ADL)?是这样我们可以写cout << stuff而不是std::operator<<(cout, stuff)?如果是这种情况,为什么ADL不限于运营商而不是所有功能?

如果C++有其他方法来执行内置和用户定义类型的通用输出,例如类型安全的printf可变参数模板,是否可以防止引入ADL ?

c++ history argument-dependent-lookup

9
推荐指数
3
解决办法
1207
查看次数