оптимизация — пропустить некоторые аргументы в функции C ++?

У меня есть функция C ++, которая имеет 5 аргументов, все из которых имеют значения по умолчанию. Если я передам первые три аргумента, программа назначит значение по умолчанию для последних двух аргументов. Есть ли способ передать 3 аргумента и пропустить один в середине, давая значения, скажем, первый, второй и пятый аргументы?

10

Решение

Не напрямую, но вы можете что-то сделать с помощью std :: bind:

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);

Недостатком является, конечно, то, что вы переопределяете параметры по умолчанию. Я уверен, что кто-то еще придет с более умным решением, но это может сработать, если вы действительно в отчаянии.

5

Другие решения

С классической функцией с 5 аргументами невозможно дать ей только 3 или 4. Вы можете написать только 3 или 4 с аргументами по умолчанию, но в конце вы получите вызов функции с 5 аргументами.

Есть также проблемы с вашей системой, если есть несколько параметров одного типа.
Например, если у вас есть foo(int a=4,int b=5) и позвонить foo(10)откуда ты знаешь, что хочешь позвонить foo(10,5) или же foo(4,10) ?

С C ++ 11 кортежей и Именованные параметры, Вы можете обмануть это немного.

#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
}

Альтернативный метод — использовать std :: bind, как описано там

1

Нет, это невозможно.

Однако я бы посоветовал вам использовать массив типов данных параметров вместо этого, чтобы достичь сценария, который вы дали. Вы можете перегрузить также. Если типы данных параметров изменяются, вам следует определить класс, который имеет обязательные параметры в качестве членов. Передайте объект этого класса. Это не только решит вашу проблему, но также рекомендуется с точки зрения ремонтопригодности.

0

Вероятно, это то, что вы можете искать, просто обходной путь!

/*
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;
}

Ниже приведен еще один обходной путь, который также может помочь!

/*
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;
}
-2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector