将类的所有变量传递给函数

Pass all variables of class to function

本文关键字:函数 变量      更新时间:2023-10-16

我有一个函数,它接受不同类型的不同变量,并根据类型使用这些变量进行计算。

c++中的类/结构是否可以将所有公共变量传递给函数?

类似这样的东西:

class some_vars {
int a=3;
double b=5.0;
std::string str="thanks for help";
};
void f(some_vars.commaseparatedvariables);

some_vars.commaseparated变量在这里是:some_vars.a、some_vars.b、some_vars.str

edit我不想枚举整个类。我只想将类的所有公共可用变量传递给一个函数。

edit2函数可以处理不同类型的变量。因此,对我来说,传递类变量是很自然的,当需要更改时,我只需要更改它们,而不必在函数中第二次更改它们。(希望这能澄清问题。)

正如其他人所说。通过引用函数传递对象,函数将可以访问对象的所有公共成员变量;
void f(some_vars & some) {
    //some.a == 5
}

更好的是,如果您不想更改对象的变量,则通过常量引用传递它。

void f(const some_vars & some);

当然,也就是说,假设您已经创建了f函数,并且仍然有能力和意愿重写它的头和实现。否则,您将不得不将每个变量单独传递到函数中。

如果您的函数以这种方式定义…

void f(int a, double b, std::string str) {
    // implementation
}

…如果你不能更改它,那么你必须明确地提供单独的参数:

some_vars vars;
f(vars.a, vars.b, vars.str);

这是不做的方法,但会得到你想要的:您只需创建一个包含所有类成员的结构,然后将它们创建为指向原始变量的指针:

class Test
{
public:
    static struct MyParams
    {
        int* intNumber;
        float* floatNumber;
        double* doubleNumber;
    };
    Test() : 
        intNumber(100),
        floatNumber(100.1f),
        doubleNumber(100.2)
    {
        myParameters.intNumber = &intNumber;
        myParameters.floatNumber = &floatNumber;
        myParameters.doubleNumber = &doubleNumber;
    }
    MyParams& GetAllMyParameters()
    {
        return this->myParameters;
    }
private:
    int intNumber;
    float floatNumber;
    double doubleNumber;
    MyParams myParameters;
};
void CalcAllParams(Test::MyParams* _myParams)
{
    double sum = 0.0;
    sum = *_myParams->intNumber + *_myParams->floatNumber + *_myParams->doubleNumber;
    std::cout << sum << std::endl;
}
int main()
{
    Test test;
    CalcAllParams(&test.GetAllMyParameters());

    std::cin.get();
    return 0;
}

相反,您可以将类作为引用(阅读为什么在所有情况下都不是一个好主意)或指针传递,并访问所有公共成员函数,如果您愿意的话,如下面的示例所示:

class Test
{
public:
    int intNumber;
    float floatNumber;
    double doubleNumber;
    Test()
    {
        intNumber = 1;
        floatNumber = 1.f;
        doubleNumber = 1.0;
    }
};
void CalcAllParams(Test* _testClassObject)
{
    double sum = 0.0;
    sum = (_testClassObject->intNumber + _testClassObject->floatNumber + _testClassObject->doubleNumber);
    std::cout << sum << std::endl;
}
int main()
{
    Test test;
    CalcAllParams(&test);

    std::cin.get();
    return 0;
}

不是很直接,但您可以使用std::tuple和一个辅助函数:

auto to_tuple(const some_vars& s)
{
    return st::tie(s.a, s.b, s.str); // or std::make_tuple
}

并转换

template <typename...Ts>
void f(Ts&&...);

进入

template <typename...Ts>
void f(std::tuple<Ts...>& tuple);