通过可变参数模板应用属于其他 类 的函数
Apply functions belonging to other classes through variadic templates
假设我有三个 class,ClassA
、ClassB
和 ClassC
。所有这三个 classes 都有一个名为 updateValue(int)
的函数。然后我调用了控制器 class,Controller
。谁的构造函数模板化如下:
class Controller
{
public:
template <class...Classes>
Controller(Classes & ...classes); // maybe initialize a tuple?
void setValues(int val)
{
// unpack whatever data structure and call each classes updateValue(int)
}
private:
std::tuple<Classes...classes> packedClasses; // Not sure if this is good idea? This will not compile
};
如您所见,我希望能够从某些数据结构中获取 classes,并调用它们的函数。例如,在 main 中我会有:
int main()
{
ClassA A;
ClassB B;
ClassC C;
Controller controller1(A,B);
Controller controller2(A,C);
Controller controller3(B,C);
Controller controller4(A,B,C);
controller4.setValues(20);
}
每个 class 都有自己更新值的方式,例如 ClassA
有 setValue(int)
、ClassB
有 setInt(int)
和 ClassC
有 updateNumber(int)
。我的计划是将函数 updateValue
写入每个将调用其 setter 函数的 classes 中。但是,我不确定如何实现我想要做的事情。如何解压所有 classes 并调用它们的函数 updateValue(int)
?
在您当前的界面中,您可以执行如下操作:
class Controller
{
public:
template <class...Classes>
Controller(Classes&... classes)
{
mF = [&](int val) { (classes.updateValue(val), ...); }; // Fold expression from C++17
}
void setValues(int val)
{
mF(val);
}
private:
std::function<void(int)> mF;
};
假设我有三个 class,ClassA
、ClassB
和 ClassC
。所有这三个 classes 都有一个名为 updateValue(int)
的函数。然后我调用了控制器 class,Controller
。谁的构造函数模板化如下:
class Controller
{
public:
template <class...Classes>
Controller(Classes & ...classes); // maybe initialize a tuple?
void setValues(int val)
{
// unpack whatever data structure and call each classes updateValue(int)
}
private:
std::tuple<Classes...classes> packedClasses; // Not sure if this is good idea? This will not compile
};
如您所见,我希望能够从某些数据结构中获取 classes,并调用它们的函数。例如,在 main 中我会有:
int main()
{
ClassA A;
ClassB B;
ClassC C;
Controller controller1(A,B);
Controller controller2(A,C);
Controller controller3(B,C);
Controller controller4(A,B,C);
controller4.setValues(20);
}
每个 class 都有自己更新值的方式,例如 ClassA
有 setValue(int)
、ClassB
有 setInt(int)
和 ClassC
有 updateNumber(int)
。我的计划是将函数 updateValue
写入每个将调用其 setter 函数的 classes 中。但是,我不确定如何实现我想要做的事情。如何解压所有 classes 并调用它们的函数 updateValue(int)
?
在您当前的界面中,您可以执行如下操作:
class Controller
{
public:
template <class...Classes>
Controller(Classes&... classes)
{
mF = [&](int val) { (classes.updateValue(val), ...); }; // Fold expression from C++17
}
void setValues(int val)
{
mF(val);
}
private:
std::function<void(int)> mF;
};