Generalnie, użycie funkcji szablonu variasic C++ 11 z funkcjami wymaga, aby argumenty funkcji oparte na variadic były ostatnimi na liście argumentów funkcji. Jest jeden wyjątek; są one argumentami następnymi, jeśli istnieją argumenty wariacyjne na poziomie C, które muszą być martwe jako ostatnie.W jaki sposób argumenty wariancji C++ i C mogą być używane razem?
template < typename ...Args >
int super_printf(Something x, Args &&...a, ...);
czasami losowo myśleć o C++, i zastanawiałem się, jak taka funkcja może być realizowana. Najpierw myślałem o zwykłym rekurencyjnym obieraniu argumentów z a, potem przypomniałem sobie, że warianty poziomu C nie kaskadają. Muszę od razu zamienić je na ostateczną listę va_list.
template < typename ...Args >
int super_vaprintf(Something x, std::va_list &aa, Args &&...a);
// Note that "aa" is passed by reference.
template < typename ...Args >
int super_printf(Something x, Args &&...a, ...)
{
std::va_list args2;
int result;
va_start(args2, XXX); // (A)
try {
result = super_vaprintf(x, args2, std::forward<Args>(a)...);
} catch (...) {
va_end(args2); // (1)
throw;
}
va_end(args2); // (2)
return result;
// Can (1) and (2) be compacted with RAII using a custom deleter lambda
// in std::unique_ptr or something? Remember that "va_end" is a macro!
}
Zwykła C++ o zmiennej liczbie argumentów rekurencyjne złuszczanie się dzieje w zaproszeniu super_vaprintf
. W linii (A), co dzieje się na miejscu XXX
, "a" lub "a ..."? Co się stanie, jeśli abędzie puste, czy zamiast tego będzie tam x? Jeśli to ostatnie pytanie jest prawdziwe, czy wkręcamy je, jeśli nie ma żadnego x; że poza tymi wariantowymi nie ma żadnych argumentów? (A jeśli to prawda, w jaki sposób conditionalize kod używać x gdy jest pusta, a się inaczej?)
...
Właśnie spojrzałem na kopię Standard C++ 11 dla każdej pomocy tutaj. Wygląda na to, że nie ma żadnych. Spowodowałoby to żądanie, aby komitet C++ powrócił, aby to naprawić, ale nie jestem pewien, czy istnieje sposób, aby można było wywołać taką funkcję, gdyby nie wszystkie warianty C++. Czy się mylę; czy można wywołać funkcję, aby używać zarówno C++ jak i C varargs? A może mieszanie jest użyteczne tylko w przypadku deklaracji, jeśli chodzi o głupie sztuczki (szablon)?
Zaraz po wysłaniu tego, zdałem sobie sprawę, że może coś w stylu "' super_printf (Something {}, 1, 2, 3, 4) '" może wymusić pewne argumenty jako C-level ("3" i "4" w tym przypadku). –
CTMacUser
są one ortogonalne, ponieważ c va działa w czasie wykonywania, a szablony variadic C++ pracują w czasie kompilacji –
@CTMacUser: tak, to by działało. Pytanie pozostaje takie, jak jest użyteczne, i powiedziałbym w metaprogramowaniu, że może to być . może uda ci się znaleźć lepszy wgląd w czytanie propozycji szablonów variadic, mogą wyjaśnić, dlaczego jest to możliwe. – PlasmaHH