Реализация класса доступа, созданная из пакетов параметров шаблона
Я хотел бы создать все States
в MachineT
как shared_ptr<T>
затем получите к ним доступ по имени типа.
В следующем коде он относится к созданию экземпляра (конструктор MachineT) и способу доступа к состояниям (функция получения).
Есть ли какой-нибудь трюк с хэш-картой или способ сохранить в классе информацию об индексе, такую как StateA::Index
?
#include <memory>
#include <vector>
template <typename... States>
class MachineT {
public:
MachineT() {
states_.resize(sizeof...(States));
for (unsigned i = 0; i < states_.size(); ++i) {
// Instanciate states
// states_[i].reset(new decltype(State[i])());
}
}
~MachineT() {}
class State {
State(int state_id) : state_id_(state_id) {}
const size_t state_id_;
};
template<typename T>
std::shared_ptr<T> get() {
// Retrun the shared_ptr to the State
}
std::vector<std::shared_ptr<State>> states_;
};
struct StateA; // Forward declaration
struct StateB;
using StateMachine = MachineT<StateA, StateB>;
class StateA : StateMachine::State {};
class StateB : StateMachine::State {};
int main(int argc, char const* argv[]) {
StateMachine sm;
std::shared_ptr<StateA> state_a = sm.get<StateA>();
return 0;
}
1 ответ
Решение
Это вполне выполнимо. Вот как это сделать в C++14:
#include <memory>
#include <tuple>
template <typename... States>
class MachineT {
public:
MachineT()
: states_{
std::make_shared<States>()...
} {
}
~MachineT() {}
template<typename T>
std::shared_ptr<T> get() {
return std::get<std::shared_ptr<T>>(states_);
}
std::tuple<std::shared_ptr<States>...> states_;
};
struct State1 {};
int main() {
MachineT<State1> a;
a.get<State1>();
}
Эквивалент std::get
может быть реализован с помощью инструментов C++11