小编C_R*_*Rod的帖子

在模板方法中确定 STL 容器中项目的数据类型

我正在尝试编写一个模板方法来处理 STL 容器中的项目。获取容器的详细信息很容易(并且我使用 std::enable_if 子句来允许仅当容器可以迭代时才调用此模板方法(检测到 begin() 方法。))我还需要了解数据容器所持有的类型。这是有效的:

template <typename CONTAINER>
std::string doStuff(const CONTAINER & container) {
   using CONTAINER_TYPE = typename CONTAINER::value_type;
}
Run Code Online (Sandbox Code Playgroud)

if constexpr如果我还可以确定容器中保存的东西的类型,我可以使用此方法来执行某些操作。这是不起作用的代码,但就像我正在尝试的那样:

template <typename CONTAINER, typename ITEM>
std::string doStuff(const CONTAINER<ITEM> & container) {
   using CONTAINER_TYPE = typename CONTAINER::value_type;
   using ITEM_TYPE = typename ITEM::value_type;
}
Run Code Online (Sandbox Code Playgroud)

为什么我不能以这种方式调用该方法是完全有道理的,但是我可以做什么(调用该方法或在方法内部进行元编程)来确定容器中项目的类型。我想这样做,以便在编译时就知道它。

(我已经尝试了 decltype 和 invoke_result 的几种排列以及大量的搜索,但还没有什么效果。)我尝试过例如:

using ITEM_TYPE = std::invoke_result<&CONTAINER::begin>::type;
Run Code Online (Sandbox Code Playgroud)

当然,这会返回一个需要取消引用的迭代器类型,但“*”在这里似乎没有按预期工作。

c++ templates stl metaprogramming

1
推荐指数
1
解决办法
190
查看次数

在方法中更改时,类中的私有指针不会更新

我有这些类(为了便于阅读而剥离)

class node {
   public:
   int x;
   node* next;

   node(){}
   ~node(){}
 };

 class intLinkedList{
     public:
         intLinkedList();
         ~intLinkedList();

         void Add (int newX);

     private:
         node* root;
  };
Run Code Online (Sandbox Code Playgroud)

这是Add中的实现

void intLinkedList::Add (int newX){
  node* newNode = new node();
  newNode->x = newX;
  newNode->next = NULL;

  std::cout << "\n\n" << root << "\n\n" << std::flush;

  if (root == NULL){
    root = newNode;    
    return;
  }

  node * current;
  current = root;

  while (current->next != NULL){
    current = current->next;
  }

  current->next = newNode;

  return;
}
Run Code Online (Sandbox Code Playgroud)

当我在设置后立即打印出root指向的地址时,它会显示一个有效的地址.但是,下次调用Add时,root再次变为NULL.我无法想象造成这种情况的行为.绝对没有其他用途.

我完全意识到我缺少一些简单的东西.如果你倾向于投票,因为问题很简单,那就把它带到其他地方.这个平台的目的是让编码人员在我们进行编码脑力训练时聚在一起互相帮助. …

c++

0
推荐指数
1
解决办法
82
查看次数

标签 统计

c++ ×2

metaprogramming ×1

stl ×1

templates ×1