Follow

Хочу рассказать про интересную конструкцию в C++, которая появилась начиная с 11-го стандарта. Называется using конструктор (встречал еще название Inheriting constructors). Лучше всего её продемонстрировать на примере:

<iostream>
<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 классов в тестах.

Sign in to participate in the conversation
CleverLibre Social

CleverLibre Social is an inclusive social instance for open discussion, learning, and community.
All cultures welcome.
Hate speech and harassment strictly forbidden.