【发布时间】:2017-10-25 14:12:01
【问题描述】:
我想实现一个图表,其中每个节点都有数据。但是我还不知道我会得到什么样的数据。因此我认为我应该使用可变参数模板来制作它。我的班级Node 必须像这样进行一些思考:
//in Node.hpp
template<typename Identifier , typename... NodeData>
class Node {
private:
nodeData... data;
//std::tuple<nodeData...> data;
Identifier ID;
public:
Node(Identifier nodeID, NodeData... data){
this->ID = nodeID;
this->data = data;
}
void set_data(nodeData... data){
this->data = data;
}
nodeData... get_data(){
//std::tuple<nodeData...> get_data() {
return this->data;
}
但您可能知道,它不是那样工作的,但我不知道如何使它正确。 NodeData 几乎可以是所有东西,例如一个字符串和两个 int。
此外,此类在其他地方(在Graph 类中)使用,其功能看起来像
//in Graph.hpp
void update_data(Identifier ID, nodeData... data){
get_Node(ID).Node<Identifier, nodeData...>::set_data(data)
// get_Node(ID).Node<Identifier, nodeData...>::set_data(data...)
}
你觉得这个语法合适吗(假设 set_data 有效)?
提前感谢您提供任何帮助/线索,
Ezor
PS:对不起我的英语不好
【问题讨论】:
-
您不能将参数包作为数据成员。
NodeData... data;不是可接受的班级成员。最接近的可能是std::tuple<NodeData...> data;。 -
感谢您的超快速回答!我必须使用元组还是这只是许多其他解决方案?因为我不能在这里使用它(
'tuple' could not be resolved错误) -
您始终可以提出自己的解决方案,但
std::tuple旨在包含不同类型的对象集。见std::tuple。请务必包含#include <tuple>。它不像其他容器那样容易使用,但这是使用可变参数模板的结果。 -
@Ezor 作为实现一组任意类型对象的标准方法,
std::tuple是自然的选择,除非您找到使用其他任何东西的特定理由。 -
我同意你的看法。但由于某种原因,
tuple是“无法解决”,尽管我事先已经将其包含在内(目前无法理解)
标签: c++ variadic-templates variadic-functions variadic