Хочу рассказать про интересную конструкцию в C++, которая появилась начиная с 11-го стандарта. Называется using конструктор (встречал еще название Inheriting constructors). Лучше всего её продемонстрировать на примере:
#include <iostream>
#include <cstdint>
namespace legacy
{
struct Configuration
{
// Empty for simplicity
};
}
struct Configuration
{
// Empty for simplicity
};
class Server
{
public:
explicit Server(legacy::Configuration)
{
std::cout << "Creating server using legacy config" << std::endl;
}
explicit Server(Configuration)
{
std::cout << "Creating server using config" << std::endl;
}
explicit Server(const std::string& config)
{
std::cout << "Creating server using text config" << std::endl;
}
};
class MockServer : public Server
{
using Server::Server;
};
int main()
{
Server s1{legacy::Configuration{}};
Server s2{Configuration{}};
Server s3{"127.0.0.1:8080"};
std::cout << "----------" << std::endl;
MockServer s4{legacy::Configuration{}};
MockServer s5{Configuration{}};
MockServer s6{"127.0.0.1:8080"};
return 0;
}
Вывод в stdout будет следующий:
Creating server using legacy config
Creating server using config
Creating server using text config
----------
Creating server using legacy config
Creating server using config
Creating server using text config
Есть объект класса Server, в MockServer пишем:
using Server::Server;
В результате объекты класса MockServer можно будет создать с точно такими же конструкторами, как и объекты класса Server, при этом конструкторы явно реализовывать не требуется.
Данная возможность порой очень полезна при написании различных Mock классов в тестах.