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

时间:2015-06-26 18:16:11

标签: c++ class parameter-passing

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

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

这样的事情:

class some_vars {
int a=3;
double b=5.0;
std::string str="thanks for help";
};

void f(some_vars.commaseparatedvariables);

some_vars.commaseparatedvariables将在这里:some_vars.a,some_vars.b,some_vars.str

编辑我不想通过课程进行枚举。我只想将类的所有公共可用变量传递给函数。

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

4 个答案:

答案 0 :(得分:2)

正如其他人所说。通过引用传递对象函数,函数可以访问所有对象的公共成员变量;

void f(some_vars & some) {
    //some.a == 5
}

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

void f(const some_vars & some);

当然,假设您已经创建了f函数并且仍然具有权限并且将重写其标头和实现。否则,您必须将每个变量分别传递给函数。

答案 1 :(得分:0)

如果您的功能以这种方式定义......

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

...而你无法改变它,那么你必须明确提供个别参数:

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

答案 2 :(得分:0)

这是不怎么做但会导致你要求的: 您只需创建一个包含其中所有类成员的结构,您只需将它们创建为指向原始变量的指针:

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

答案 3 :(得分: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);