Não é possível recuperar argumentos do construtor em uma tupla.
Estou tentando extrair os tipos de parâmetros do construtor de uma dada classe como um std::tuple
. Por exemplo, se eu tiver uma classe como esta:
struct MyClass {
MyClass(int, double, std::string) {}
};
Quero obter um tipo como std::tuple<int, double, std::string>
correspondente aos parâmetros do construtor.
Estou ciente de que no Boost.DI, isso parece ser possível, já que eles conseguem resolver dependências do construtor automaticamente. No entanto, não consegui encontrar uma explicação clara de como eles extraem os tipos de parâmetros do construtor.
Para funções regulares, sei como usar std::tuple
modelos, conforme mostrado abaixo:
template <typename Func>
struct function_traits;
// Specialization for functions
template <typename Ret, typename... Args>
struct function_traits<Ret(Args...)> {
using args_tuple = std::tuple<Args...>;
};
No entanto, não tenho certeza de como adaptar essa abordagem para construtores.
Restrições:
- Prefiro soluções compatíveis com C++14 ou C++17, mas estou aberto a ver abordagens usando C++20 ou mais recente.
- Não sou contra o uso do Boost ou de outras bibliotecas, se necessário.
Alguém poderia me orientar sobre como conseguir isso? Talvez um exemplo mínimo ou uma explicação de como o Boost.DI faz isso?
Caso haja vários construtores, o boost di diz que escolhe o construtor mais longo. Como ele faz isso também?
Exemplo de como o boost di funciona (da documentação oficial). ref : boost di exemple
// $CXX -std=c++14 basic_create_objects_tree.cpp
#include <boost/di.hpp>
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<app>();
}
Acho que tenho uma pista usando este arquivo, mas ainda não consigo entender completamente o sistema e como posso implementá-lo. boost/di/type_traits/ctor_traits.hpp