Mam funkcję C++, która ma 5 argumentów, z których wszystkie mają wartości domyślne. Jeśli przekażę pierwsze trzy argumenty, program przypisze wartość domyślną do dwóch ostatnich argumentów. Czy istnieje sposób przekazywania 3 argumentów i pomijania jednego w środku, dając wartości do powiedzenia, argumenty pierwszy, drugi i piąty?Pomiń niektóre argumenty w funkcji C++?
Odpowiedz
Nie, nie jest to możliwe.
Proponuję jednak, abyś zamiast tego podał , używając tablicy parametrów typu, aby uzyskać podany scenariusz. Możesz również przeciążać. Jeśli typy danych różnią się, powinieneś zdefiniować klasę, która ma wymagane parametry jako członkowie. Przekaż obiekt tej klasy. To nie tylko rozwiąże Twój problem, ale także jest zalecane z punktu widzenia łatwości konserwacji.
Nie bezpośrednio, ale może być w stanie coś zrobić z std :: wiążą:
int func(int arg1 = 0, int arg2 = 0, int arg3 = 0);
// elsewhere...
using std::bind;
using std::placeholders::_1;
auto f = bind(func, 0, _1, 0);
int result = f(3); // Call func(0, 3, 0);
Minusem jest oczywiście, że są ponownie określając parametry domyślne. Jestem pewien, że ktoś inny przyjdzie z bardziej sprytnym rozwiązaniem, ale może to zadziałać, jeśli jesteś naprawdę zdesperowany.
Przy klasycznej funkcji 5 argumentów, nie ma możliwości nadania jej tylko 3 lub 4. Można pisać tylko 3 lub 4 z domyślnymi argumentami, ale na końcu otrzymasz wywołanie funkcji z 5 argumentami.
Występują również problemy z systemem, jeśli istnieje kilka parametrów tego samego typu. Na przykład, jeśli masz foo(int a=4,int b=5)
i dzwonisz pod numer foo(10)
, to skąd wiesz, że chcesz zadzwonić pod numer foo(10,5)
lub foo(4,10)
?
Z krotkami C++ 11 i Named parameters idiom można oszukać go trochę.
#include <iostream>
#include <functional>
#include <tuple>
#include <string>
struct f_
{
private:
typedef std::tuple<int,int,double> Args;
//default arguments
static constexpr const Args defaults = std::make_tuple(10,52,0.5);
Args args;
public :
f_():args(defaults)
{}
template <int n,class T> f_& setArg(T&& t)
{
std::get<n>(args) = t;
return *this;
}
void operator()()
{
return (*this)(std::move(args));
}
void operator()(Args&& a)
{
int n1=std::get<0>(a);
int n2=std::get<1>(a);
double n3=std::get<2>(a);
std::cout<<n1<<" "<<n2<<" "<<n3<<std::endl;
}
};
#define set(n,v) setArg<n>((v))
int main()
{
//f_().set<1>(42).set<3>("foo")();
f_().setArg<1>(42)(); //without Macro
f_().set(0,666).set(1,42)(); //with Macro
f_()(); //without any parameters
f_()(std::forward_as_tuple(-21,-100,3.14)); //direct call
}
Alternatywną metodą jest użycie std :: wiążą opisanym there
Prawdopodobnie jest to coś, co może być szukasz, tylko obejście!
/*
Function f() is called by passing 2 arguments. So to make sure that these 2 arguments are treated as
first and third, whereas the second and the fourth are taken as defaults:
SOLUTION 1 : using recursive call
*/
#include <iostream>
using namespace std;
void f(int = 10,int = 20, int = 30, int = 40);
static int tempb;
static int flag = 1;
int main()
{
cout << "calling function \n";
//f();
f(12,39);
}
void f(int a,int b,int c,int d)
{
//static int flag = 1;
//f();
if(flag == 1)
{
--flag;
f(); //recursive call to intialize the variables a,b,c,d as per the prototype
c = b;
b = tempb;
//cout << c;
}
else
{
tempb = b;
return;
}
cout << endl <<"a = " << a << endl << "b = "<< b << endl << "c = " << c << endl << "d = " << d << endl;
}
Oto kolejne obejście problemu, które może pomóc!
/*
Function f() is called by passing 2 arguments. So to make sure that these 2 arguments are treated as
first and third, whereas the second and the fourth are taken as defaults:
SOLUTION 2 : using static variable
*/
#include <iostream>
using namespace std;
void f(int = 10,int = 20, int = 30, int = 40);
static int tempb;
int main()
{
f();
f(12,39);
}
void f(int a,int b,int c,int d)
{
static int flag = 1;
if(flag == 1)
{
--flag;
tempb = b;
return;
}
else
{
c = b;
b = tempb;
}
cout << "a = " << a << endl << "b = " << b << endl << "c = " << c << endl << "d = " << d;
}
Nie mogę wybrać globalnej zmiennej statycznej, aby wybrać parametry metody. Nikt nie powinien stosować tego podejścia. – Brannon
- 1. Pomiń niektóre podsystemy C++
- 2. Pomiń niektóre kolumny w SqlBulkCopy
- 3. Python nosetests pomiń niektóre testy
- 4. C++ argumenty funkcji sprawdzania kompilacji w czasie
- 5. C++ 11 lambdas jako domyślne argumenty funkcji
- 6. C++ wysyła argumenty dowolnego typu do funkcji
- 7. Nieograniczone argumenty w funkcji JavaScript
- 8. Inline Argumenty funkcji Uboczny
- 9. Czyste funkcje wirtualne i niewykorzystane argumenty funkcji podrzędnych w C++
- 10. F # argumenty funkcji zmienny
- 11. javascript opcjonalne argumenty funkcji
- 12. Argumenty funkcji wiele typów
- 13. Podkreśl argumenty w treści funkcji w vim
- 14. Argumenty opcjonalne C++/CLI
- 15. Referencje jako argumenty funkcji?
- 16. Wyluzuj sześcienny - Argumenty funkcji Wyjaśnienie
- 17. Czy kompilator zoptymalizuje nieużywane argumenty funkcji statycznej?
- 18. C, pomiń inicjalizację tablicy statycznej
- 19. Jak określić tylko niektóre opcjonalne argumenty podczas wywoływania funkcji w ColdFusion?
- 20. jak przekazywać argumenty do funkcji w funkcji r
- 21. Przekazywanie funkcji w R jako argumenty .Fortrana
- 22. Argumenty funkcji JavaScript dla funkcji filtru
- 23. Metoda Nullable Argumenty w C#
- 24. Zmuszanie nazwane argumenty w C#
- 25. Czy można całkowicie ignorować argumenty variadyczne dla funkcji C?
- 26. Dostęp argumenty funkcji od dekoratora
- 27. Argumenty szablonów do funkcji szablonu
- 28. C++ Funkcja wiążą powtarzające się argumenty dla funkcji curry
- 29. Rozwiń wektor na argumenty funkcji
- 30. Typy przekazywania jako argumenty funkcji w Haskell?
Krótka odpowiedź: nr –
Istnieją obejścia. Ale jeśli możesz, przeładuj zamiast tego. – jrok