C++ 0x umożliwi szablonowi pobranie dowolnej liczby argumentów. Jakie jest najlepsze wykorzystanie tej funkcji poza implementacją krotek?Variadic templates
Odpowiedz
- typu bezpieczny printf
- przekazywanie dowolnych wielu argumentów konstruktora w Metody fabryczne
- Posiadając dowolne klasy bazowe pozwala na umieszczanie i usuwanie przydatnych zasad.
- Inicjowanie poprzez przenoszenie heterogenicznych obiektów maszynowych bezpośrednio do kontenera za pomocą konstruktora szablonu variadic.
- Posiadanie operatora literackiego , który może obliczyć wartość dla literału zdefiniowanego przez użytkownika (np. "10110b").
próbki do 3:
template<typename... T> struct flexible : T... { flexible(): T()... { } };
próbki do 4:
struct my_container { template<typename... T> my_container(T&&... t) { } };
my_container c = { a, b, c };
próbki do 5:
template<char... digits>
int operator "" b() { return convert<digits...>::value; }
Patrz kod przykład: here
- typu bezpieczny
printf
Tak, ale wciąż muszę zobaczyć bardzo elegancką implementację tego :-) –
I thi nk ten konkretny przykład jest nieco zdegenerowany. Pamiętaj, że dla każdej instancji kompilator musi utworzyć więcej kodu. czy możesz sobie wyobrazić tworzenie ponad 100 wersji printf dla każdej możliwej kombinacji argumentów? Och, wzdęcie! – shoosh
@Shy: nie, jeśli wszystkie wersje są wbudowanymi owijkami dla * real * printf. – CesarB
Umożliwienie rzeczy jak Boost.Function podjąć dowolne numery parametrów
Właśnie napisałem o tym, jak zaimplementować wiele interfejsów COM i zachować swój kod kompaktowy i elegancki z szablonami variadic C++ 0x.
Wpisz bezpieczeństwo każdego połączenia z dynamicznym numerem argumentu.
Czy możesz być bardziej precyzyjny? – alestanis
Zaimplementowałem NDArray (N-wymiarowa tablica) i ma metodę setSizes z variadic liczba argumentów. Użycie argumentów szablonu variadic jest bezpieczniejsze niż używanie argumentów funkcji variadic, ponadto mogę kontrolować liczbę parametrów przekazywanych do tej funkcji w czasie kompilacji tylko z argumentami szablonu variadic.
void setSizes(uintmax_t currentSize) {
static_assert(1 == NDimensions, "Invalid count of arguments given to setSizes.");
size_ = currentSize;
data_ = new NDArrayReferenceType[currentSize];
}
template <typename... Sizes>
void setSizes(uintmax_t currentSize, Sizes... sizes) {
static_assert(sizeof...(Sizes) + 1 == NDimensions, "Invalid count of arguments given to setSizes.");
size_ = currentSize;
data_ = new NDArrayReferenceType[currentSize];
for (uintmax_t i = 0; i < currentSize; i++) {
data_[i]->setSizes(sizes...);
}
}
Zaimplementowałam również uniwersalne opakowanie konstruktora dla mojego własnego SmartPointera. Zawija on nad wszystkimi zdefiniowanymi przez użytkownika konstruktorami typu surowego wskaźnika.
template <typename TSmartPointer, typename... Args>
static inline void initialize(TSmartPointer *smartPointer, Args... args) {
smartPointer->pointer_ = new typename TSmartPointer::PointerType(std::forward<Args>(args)...);
smartPointer->__retain();
}
Kod ten wydaje się być inobvious, jest to część inicjatora w sprytny wskaźnik dla przypadku, czy sprytny wskaźnik powinien automatycznie wywołać konstruktora wskaźnik na nabycie sprytny wskaźnik (RAII). W przypadku klas abstrakcyjnych nie można wywołać konstruktora.
Więc jeśli mam AbstractObject typ, który jest sprytny wskaźnik od klasy abstrakcyjnej, a typ ConcreteObject, który jest sprytny wskaźnik klasy z konstruktora, że trwa dwa ints, mogę napisać następujący kod:
AbstractObject object = ConcreteObject(42, 42);
to jest jak C# i Java (ale z RAII) i to działa na mnie w C++/GCC 4.8 =)
W innych odpowiedziach wymieniano bezpieczny printf, ale bardziej ogólnie szablony variadyczne można wykorzystać do implementacji funkcji formatowania, które w ogóle nie wymagają podania informacji o typie poprzez specyfikatory formatu. Na przykład, C++ Format library narzędzia formatowania funkcje podobne do Pythona str.format:
fmt::print("I'd rather be {1} than {0}.", "right", "happy");
oprócz bezpiecznego printf. Rodzaje argumentów są przechwytywane automatycznie przy użyciu szablonów variadic w C++ 11.
To sprawia printf Specyfikatory jak lld
lub notorycznie PRIdPTR
niepotrzebne i zamiast
std::printf("Local number: %" PRIdPTR "\n\n", someIntPtr);
można po prostu użyć
fmt::printf("Local number: %d\n\n", someIntPtr);
Oświadczenie: Jestem autorem tej biblioteki
- 1. Variadic variadic szablon szablon parametry
- 2. Generics/templates in python?
- 3. Lambdas w szablonach variadic
- 4. Ember-Rails i namespaced templates
- 5. jQuery Templates - wymienić zawartość DIV
- 6. Netbeans Code Templates Składnia formatowania
- 7. znajdź django/contrib/admin/templates
- 8. załadować jQuery-Templates z zewnętrznego pliku?
- 9. Jak zrobić variadic is_same?
- 10. Rozszerzenie zestawu szablonów Variadic
- 11. Szablon Variadic Klasa podsumowująca
- 12. Konwersja wskaźnika funkcji Variadic
- 13. Funkcje Qt i variadic
- 14. Funkcja komponowania Variadic?
- 15. Ekstrakcje szablonów Variadic
- 16. odczytać argumenty z szablonu variadic
- 17. Wymuszenie szablonu variadic określonego typu
- 18. Czy makra Variadic są niestandardowe?
- 19. Symulować szablony variadic w C#
- 20. Szablony Variadic bez parametrów funkcji
- 21. Variadic szablony i typy zabezpieczeń
- 22. SFINAE z klasami szablonów variadic?
- 23. Przekazywanie pozycji argumentu szablonu variadic
- 24. C++ variadic szablon argument iteracyjny
- 25. Jak używać zmiennej XSL w xsl: apply-templates?
- 26. Jak radzić sobie z Camel Case for Eclipse Templates?
- 27. C++ Shared Library with Templates: Niezdefiniowane symbole error
- 28. Rozpakowywanie listy argumentów za pomocą szablonu Variadic
- 29. Jak przekazywać elementy tablicy do funkcji variadic?
- 30. Czy typelists zostały całkowicie zastąpione szablonami variadic?
nie tylko bezpieczny dla typu printf, ale także bezpieczne funkcje variadyczne? –