Mam funkcję, która skanuje system plików użytkownika, wypełnia wektor ścieżkami, a następnie sortuje je lub nie. Ponieważ użytkownik powinien móc decydować podczas kompilacji, czy chce sortować wektor, czy nie, używam szablonów i klas pomocniczych w miejsce bardzo pożądanego (ale nieistniejącego) "statycznego jeśli".Metaprogramowanie szablonu C++, obejście "statyczne, jeśli" - czy można je poprawić?
Rozważmy następujący kod:
enum class Sort{Alphabetic, Unsorted};
template<Sort TS> struct SortHelper;
template<> struct SortHelper<Sort::Alphabetic>
{
static void sort(vector<string>& mTarget) { sort(begin(mTarget), end(mTarget)); }
};
template<> struct SortHelper<Sort::Unsorted>
{
static void sort(vector<string>&) { }
};
template<Sort TS> struct DoSomethingHelper
{
static void(vector<string>& mTarget)
{
// do something with mTarget
SortHelper<TS>::sort(mTarget);
}
};
Kod pisałem powyżej jest znacznie uproszczone od the original, który zajmuje wiele parametrów szablonu, aby umożliwić użytkownikowi dostosowanie jeszcze wyników funkcji w czasie kompilacji .
Czy istnieje alternatywa dla używania wszystkich tych klas pomocników? Robi się naprawdę brudny i trudny do odczytania.
Idealnie, to jest to, co chciałbym napisać:
enum class Sort{Alphabetic, Unsorted};
template<Sort TS> struct DoSomethingHelper
{
static void(vector<string>& mTarget)
{
// do something with mTarget
static_if(TS == Sort::Unsorted) { /* do nothing */ }
static_if(TS == Sort::Alphabetic) { sort(begin(mTarget), end(mTarget)); }
}
};
Nieistniejące i [prawdopodobnie nieistniejące] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3613.pdf). – Morwenn
Hm, dlaczego dbasz o to podczas kompilacji? Wygląda na to, że bardzo nad tym zastanawiasz. Jeśli najpierw skanujesz drzewo katalogów, pojedyncza gałąź czasu wykonywania będzie znacznie niższa od testu porównawczego w zakresie wpływu na wydajność. –
Jeśli wszystkie gałęzie są syntaktycznie i semantycznie poprawne, możesz użyć zwykłego 'if', a optymalizator wyeliminuje nieaktywne gałęzie, a także niepotrzebne comditionals/jumps. Jeśli nieaktywne gałęzie nie kompilują się, pomocnicy są jedyną drogą. – Angew