我有一个函数,它使用不同类型的不同变量,并根据类型对变量进行计算。
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 该函数可以处理传递给它的不同类型的可变数量的变量。所以对我来说,传递类变量是很自然的,当需要进行更改时,我只需要更改它们,而不必在函数中第二次更改它们。 (希望这可以解决问题。)
答案 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);