Często mam pewne zachowanie prototypowe, które generuje dane wyjściowe na podstawie niektórych metod projektowania. Modyfikuję metodę projektowania, która pozwala na wiele funkcji, których potrzebuję. Czasami jednak metoda projektowania jest podawana w czasie wykonywania, więc zazwyczaj muszę napisać wielką instrukcję przełączania. Zwykle wygląda to tak:Wykonanie funkcji opartej na liczbie całkowitej na podstawie parametru wykonawczego
enum class Operation
{
A, B
};
template<Operation O>
void execute();
template<>
void execute<A>()
{
// ...
}
template<>
void execute<B>()
{
// ...
}
void execute(Operation o)
{
switch (o)
{
case Operation::A: return execute<Operation::A>();
case Operation::B: return execute<Operation::B>();
}
}
Jestem ciekaw, czy ktoś zorientowali się piękny wzór dla tego systemu - główne wady tej metody jest to, że trzeba wpisać wszystkie obsługiwane wyliczeń i zrobić utrzymywać kilka miejsc, jeśli są realizowane nowe wyliczenia.
e: Powinienem dodać, że przyczyną problemów z szablonami kompilacji jest umożliwienie kompilatorowi inline metod w HPC, a także dziedziczenie właściwości constexpr.
e2: w rzeczywistości, domyślam się, że proszę o to, aby kompilator wygenerował wszystkie możliwe ścieżki kodu przy użyciu niejawnej struktury przełącznika. Być może jakiś rekurencyjny szablon magii?
Co z wykorzystaniem dziedziczenia i polimorfizmu? –
Jak już dodałem, niezwykle ważne jest, aby kompilator mógł wykonywać inlineing i optymalizacje w czasie kompilacji (tj. Cała struktura kodu jest widoczna i deterministyczna). W przeciwnym razie, wirtualne funkcje oczywiście rozwiązują problem. – Shaggi