我试图为从std :: tuple派生的类分配一些值。 我想到的第一件事是使用make_tuple ,然后使用operator=复制它,但这没有用。

如果我改为手动分配元组的单个值,则没有问题。

所以我写了一些代码,从项目中提取出来,专门测试这件事:

#include <tuple>
template <class idtype>
class Userdata: public std::tuple<idtype, WideString, int>
{
  public:
  /* compile error
  void assign1(const idtype& id, const WideString& name, const int lvl)
  {
    (*this)=std::make_tuple(id, name, lvl);
  }
  */
  void assign2(const idtype& id, const WideString& name, const int lvl)
  {
    (std::tuple<idtype, WideString, int>)(*this)=std::make_tuple(id, name,  lvl);
  }
  void assign3(const idtype& id, const WideString& name, const int lvl)
  {
    std::get<0>(*this)=id;
    std::get<1>(*this)=name;
    std::get<2>(*this)=lvl;
  }
  void print(const WideString& testname) const
  {
    std::cout << testname << ": " << std::get<0>(*this) << " " << std::get<1>(*this) << " " << std::get<2>(*this) << std::endl;
  }

  Userdata()
  {
  }

};


int main(int argc, char *argv[])
{
  Userdata<int> test;
  /*
  test.assign1("assign1", 1, "test1", 1);
  test.print();
  */
  test.assign2(2, "test2", 2);
  test.print("assign2");
  test.assign3(3, "test3", 3);
  test.print("assign3");
}

结果是

assign2: 0  0 
assign3: 3 test3 3

只有assign3给出了预期的结果。 因此,尽管我可以轻松使用assign3函数,但我仍然想知道assign2什么问题。

#1楼 票数:2 已采纳

(std::tuple<idtype, WideString, int>)(*this)

创建一个新的临时,然后分配给它。 强制转换为参考:

(std::tuple<idtype, WideString, int>&)(*this)=std::make_tuple(id, name,  lvl);

  ask by DrHell translate from so

未解决问题?本站智能推荐:

2回复

为什么我不能通过 std::tuple 获得保证的复制省略?

我希望在 C++20 中,以下代码在 A 和 B 的打印之间不打印任何内容(因为我希望保证 RVO 启动)。 但输出是: 一种 再见 乙 C 再见 再见 因此,大概正在创建一个临时对象。 这种行为的原因是什么? 是否有避免复制的解决方法(不使用指针)? https://
1回复

为什么`std :: forward_as_tuple(1)`不是一个常量表达式?

在上面的代码中,static_assert传递,但是第1行到第3行无法使用gcc 4.9(由ubuntu提供)和clang进行编译。 他们抱怨变量没有被constexprs初始化, x不是constexpr (即使它是由文字初始化的),也就是创建对临时的引用或者它们的forward_as_t
20回复

如何遍历 std::tuple 的元素?

如何迭代元组(使用 C++11)? 我尝试了以下方法: 但这不起作用: 错误 1:抱歉,未实现:无法将 'Listener ...' 扩展为固定长度的参数列表。 错误 2:i 不能出现在常量表达式中。 那么,如何正确迭代元组的元素?
1回复

C++ 转一个 std::tuple 变成 std​​::string?

我正在编写一个轻量级解析器组合库(类似于 Boost::Spirit)作为业余项目。 我想做的一件事是自动能够将Result<std::tuple<char>> 、 Result<std::tuple<char, char>>等转换为std::str
1回复

我可以从向量数组初始化一个 std::tuple 吗?

我有一个包含变体类的 std::vector。 我想用相同的数据构造一个元组。 这可能吗? 元组的正常构造方法似乎非常严格。 基于评论的一些澄清: 我不需要元组来逐项匹配数组,或者从给定的数组中推断出类型。 我想获取一个给定的数组,然后提取与某种类型匹配的 Variants。 因此,例如,给定
2回复

使结构表现得像std :: tuple

我写了一些通用的代码来管理元组列表。 现在,我想使用该代码,但我想使用简单的结构而不是std::tuple ,因此我可以使用名称而不是索引来访问变量。 有没有一种简单的方法可以使这些结构像std::tuple ,因此我可以将其与通用代码一起使用? 我尝试添加一个as_tuple成员函
4回复

如何从 std::tuple 中删除元素?

给定一个 如何从中删除第二个元素B以获得tuple<A,C> ,例如 或相同 我假设这会产生一种带有元素副本的新类型。
2回复

转换std :: tuple 到T

所以我给了一个std::tuple<T...> ,我想创建一个接受T...的函数指针,目前这就是我所拥有的; 但是我似乎无法找到一种方法来做到这一点,而无需手动输入0, ..., tuple_size<V>::value每个索引。 FunctionPtr在上下文