Я ищу простую реализацию алгоритма планировщика/поиска, реализованного в качестве шаблонов времени компиляции C++. Приложение для такой вещи частично академическое, отчасти обусловленное практическими потребностями в проверке кода.Многопользовательский аргумент в шаблонах C++
Вот сущность того, что я ищу: Представьте алгоритм поиска для планирования действий из состояния «Пуск» в состояние «Конец».
template<A, B> struct Step{
//all steps have:
static void doAction();
}
struct Start{};
struct State1{};
struct State2{};
struct End{};
//Transition between neighbor-states is known:
template<> struct<Start, State1>{
static void doAction(){
std::cout << "Start -> State1" << std::endl;
}
};
template<> struct<State1, State2>{
static void doAction(){
std::cout << "State1 -> State2" << std::endl;
}
};
template<> struct<State2, End>{
static void doAction(){
std::cout << "State2 -> End" << std::endl;
}
};
Теперь я хотел бы использовать магию шаблонов, чтобы найти последовательность шагов (с использованием SFINAE или другие приемы). Как можно добиться следующего?
//TODO: Implement a reasoner:
template<typename A, typename B, typename C> struct Step<A,C>{
typedef Step<A,B> S1;
typedef Step<B,C> S2;
static void doAction(){
S1::doAction();
S2::doAction();
}
};
// Code using it:
Step<Start, State1>::doAction(); //Expect: "Start -> State1"
Step<Start, State2>::doAction(); // Expect: "Start -> State1"
// "State1 -> State2"
Step<Start, End>::doAction(); // Expect: "Start -> State1"
// "State1 -> State2"
// "State2 -> End"
Несмотря на все ваши усилия, вопрос выглядит еще туманны. Но интригующе. Попробуем уточнить его. Как выглядит «результат»? – marom
Нахождение единственного уникального решения, вероятно, выполнимо (грубая сила). «Самое короткое» решение звучит как кошмар. – MSalters
Единственное уникальное решение подходит для счета. Его не нужно оптимизировать. Идея состоит в том, чтобы убедиться в некоторых свойствах во время компиляции. – user1362700