【问题标题】:Using variadics function in variadics template class在可变参数模板类中使用可变参数函数
【发布时间】: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&lt;NodeData...&gt; data;
  • 感谢您的超快速回答!我必须使用元组还是这只是许多其他解决方案?因为我不能在这里使用它('tuple' could not be resolved 错误)
  • 您始终可以提出自己的解决方案,但std::tuple 旨在包含不同类型的对象集。见std::tuple。请务必包含#include &lt;tuple&gt;。它不像其他容器那样容易使用,但这是使用可变参数模板的结果。
  • @Ezor 作为实现一组任意类型对象的标准方法,std::tuple 是自然的选择,除非您找到使用其他任何东西的特定理由。
  • 我同意你的看法。但由于某种原因,tuple 是“无法解决”,尽管我事先已经将其包含在内(目前无法理解)

标签: c++ variadic-templates variadic-functions variadic


【解决方案1】:

从这里开始。然后考虑分离构造函数参数的类型和 set_data 调用:

//in Node.hpp

#include <tuple>

template<typename Identifier , typename... NodeData>
class Node {
private:
    Identifier ID;
    std::tuple<NodeData...> data;

public:
    Node(Identifier nodeID, NodeData... data)
    : ID(nodeID)
    , data { data ... }
    {
    }

    void set_data(NodeData... data){
        this->data = std::tie(data...);
    }

    auto get_data() const {
        return this->data;
    }
};


Node<int, int, float>& get_Node(int id)
{
    // whatever you need to do here
}

//in Graph.hpp
template<class Identifier, class...nodeData>
void update_data(Identifier ID, nodeData... data)
{
    get_Node(ID).set_data(data...);
}

int main()
{
    Node<int, int, float> x = { 10, 1, 2.1 };

    update_data(10, 1, 2.1);

}

【讨论】:

  • 非常感谢。我正在做类似的事情,但拥有它非常令人兴奋。我之前关于tuple 的问题似乎只是Eclipse 显示的一个假错误。真正的问题是我设置data的方式。
猜你喜欢
  • 2021-10-01
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多