假设我们有这样的宏
#define FOO(type,name) type name
Run Code Online (Sandbox Code Playgroud)
我们可以使用哪个
FOO(int, int_var);
Run Code Online (Sandbox Code Playgroud)
但并不总是那么简单:
FOO(std::map<int, int>, map_var); // error: macro "FOO" passed 3 arguments, but takes just 2
Run Code Online (Sandbox Code Playgroud)
我们当然可以这样做:
typedef std::map<int, int> map_int_int_t;
FOO(map_int_int_t, map_var); // OK
Run Code Online (Sandbox Code Playgroud)
这不是非常符合人体工程学的.必须处理类型不兼容的问题.知道如何用宏来解决这个问题吗?
在OO,一个通常与接口实现回调:(粗示例)
class Message {}
class IMsgProcessor {
public:
virtual void handle_msg(const Message& msg) = 0;
}
class RequestMsgProcessor : public IMsgProcessor {
virtual void handle_msg(const Message& msg) {
// process request message
}
}
class CustomSocket {
public:
Socket(IMsgProcessor* p) : processor_(p) {}
void receive_message_from_network(const Message& msg) {
// processor_ does implement handle_msg. Otherwise a compile time error.
// So we've got a safe design.
processor_->handle_msg(msg);
}
private:
IMsgProcessor* processor_;
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.使用C++ 11,另一种方法是让CustomSocket只接收std :: function对象的实例.它并不关心它的实现位置,或者即使对象是非null值:
class CustomSocket {
public:
Socket(std::function<void(const …Run Code Online (Sandbox Code Playgroud) 考虑这个有三个构造函数的类:
class Circle {
public:
Circle(int r) {
_radius = r;
}
Circle(const Circle& c){
_radius = c.radius();
cout << endl << "Copy constructor with lvalue reference. Radius: " << _radius;
}
Circle(Circle&& c){
_radius = c.radius();
cout << endl << "Copy constructor with rvalue reference. Radius:" << _radius;
}
int radius() const {
return _radius;
}
private:
int _radius;
};
int main() {
Circle c1(2);
Circle c2(c1);
cout << endl << c2.radius();
Circle c3(Circle(4));
cout << endl << c3.radius(); …Run Code Online (Sandbox Code Playgroud)