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
Qoto Mastodon

QOTO: Question Others to Teach Ourselves
An inclusive, Academic Freedom, instance
All cultures welcome.
Hate speech and harassment strictly forbidden.