【发布时间】:2020-10-07 22:37:52
【问题描述】:
我不确定我所要求的是否可行。
我有一个名为Controller 的模板类。这是一个可变参数模板类,它接受多个类并可以设置它们的值。
Controller<ClassA,ClassB,ClassC>* myController = new Controller<ClassA,ClassB,ClassC>(*a,*b,*c);
myController->setValues(32);
这需要一堆不同的类,并允许我同时设置它们的值。 setValues 是一个模板函数,它允许传入任何类型。但是,现在我正在尝试修改我的类,以便我可以在控制器本身内设置一个值以便于检索。然而,事实证明这是困难的部分。
template<typename...Classes>
class Controller
{
public:
Controller(Classes&...objects) : objects(objects...){}
Controller(std::tuple<Classes&...> tup) : objects(tup){}
template<typename T>
void setValues(T value)
{
std::apply([&](auto&...x) { x.updateValue(value),...);}, objects); //calls the updateValue function for each class
}
private:
std::tuple<Classes&...> objects;
};
我想将以下内容添加为私有变量T controllerValue; 但是,我知道我不能简单地声明T,因为我们无法定义成员模板并且编译器不知道会发生什么。然后我尝试创建一个私有结构:
template<typename T>
struct ControllerValue { T value; };
但是,我无法在其下定义结构,因为会发生同样的问题。编译器不知道ControllerValue 是什么类型。我想要的是这样的:
template<typename...Classes>
class Controller
{
public:
Controller(Classes&...objects) : objects(objects...){}
Controller(std::tuple<Classes&...> tup) : objects(tup){}
template<typename T>
void setValues(T value)
{
thisValue.value = value;
std::apply([&](auto&...x) { x.updateValue(value),...);}, objects); //calls the updateValue function for each class
}
template<typename T>
T getValue() const { return thisValue.value }
private:
std::tuple<Classes&...> objects;
template<typename T>
struct ControllerValue { T value; };
ControllerValue thisValue;
};
这根本不会编译,因为编译器不知道ControllerValue 应该是什么类型。这就是我卡住的地方。这甚至可能吗?如果没有,我可以通过什么其他方式来完成这项工作?
为了消除混淆,用例应该是这样的:
Controller<ClassA,ClassB,ClassC>* myController = new Controller<ClassA,ClassB,ClassC>(*a,*b,*c);
myController->setValues(32);
int commonValue = myController->getValue();
或
Controller<ClassA,ClassB,ClassC>* myController = new Controller<ClassA,ClassB,ClassC>(*a,*b,*c);
myController->setValues(32.3);
double commonValue = myController->getValue();
【问题讨论】:
-
"我想将以下内容添加为私有变量 T controllerValue;"` 但是这里的
T是什么? -
@cigien 这真的取决于价值。在这种情况下,它将是一个整数。但是它可以是双精度、浮点或字符串。
-
但是这个
T是从哪里来的?在Controller里面你有...Classes。T是这些类型之一吗?哪一个? -
啊,我明白了。
T将来自setValues(T value)。 @cigien -
@NathanPierson 不,现在我想起来了。我想你只是通过问这个问题给了我我需要的解决方案。我可以将另一个模板参数添加到
Controller类,它将为整个范围定义T并坚持使用该类型。