Я пытаюсь извлечь типы параметров конструктора данного класса как std::tuple. Например, если у меня есть такой класс:
Код: Выделить всё
struct MyClass {
MyClass(int, double, std::string) {}
};
Я знаю, что в 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
Код: Выделить всё
// $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
Мобильная версия