Как получить типы параметров конструктора в виде кортежа в C++?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как получить типы параметров конструктора в виде кортежа в C++?

Сообщение Anonymous »

Невозможно получить аргументы конструктора в кортеже.
Я пытаюсь извлечь типы параметров конструктора данного класса как std::tuple. Например, если у меня есть такой класс:

Код: Выделить всё

struct MyClass {
MyClass(int, double, std::string) {}
};
Я хочу получить тип типа std::tuple, соответствующий параметрам конструктора.
Я знаю, что в Boost.DI это кажется достижимым, поскольку им удается автоматически разрешать зависимости конструктора. Однако мне не удалось найти четкого объяснения того, как они извлекают типы параметров конструктора.
Для обычных функций я знаю, как использовать std::tuple с шаблонами, как показано ниже:

Код: Выделить всё

template 
struct function_traits;

// Specialization for functions
template 
struct function_traits {
using args_tuple = std::tuple;
};
Однако я не уверен, как адаптировать этот подход для конструкторов.
Ограничения:
  • Я предпочитаю решения, совместимые с C++14 или C++17, но я открыт для рассмотрения подходов, использующих C++20 или новее.
  • Я не против при необходимости использовать Boost или другие библиотеки.
Может ли кто-нибудь подсказать мне, как этого добиться? Возможно, минимальный пример или объяснение того, как Boost.DI это делает?
В случае, если существует несколько конструкторов, boost di говорит, что выбирает самый длинный конструктор. как он это делает?
Пример работы boost di (из официальной документации).
ссылка: пример boost di

Код: Выделить всё

// $CXX -std=c++14 basic_create_objects_tree.cpp
#include 

namespace di = boost::di;

struct renderer {
int device;
};

class view {
public:
view(std::string /*title*/, const renderer&) {}
};

class model {};

class controller {
public:
controller(model&, view&) {}
};

class user {};

class app {
public:
app(controller&, user&) {}
};

int main() {
/**
* renderer renderer_;
* view view_{"", renderer_};
* model model_;
* controller controller_{model_, view_};
* user user_;
* app app_{controller_, user_};
*/

auto injector = di::make_injector();
injector.create();
}
Думаю, у меня есть представление об использовании этого файла, но я до сих пор не могу полностью понять систему и то, как ее реализовать.
boost/di/type_traits/ctor_traits.hpp

Подробнее здесь: https://stackoverflow.com/questions/792 ... tuple-in-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»