【问题标题】:Are std::tuple and std::tuple<std::tuple> considered same type by std::vector?std::tuple 和 std::tuple<std::tuple> 是否被 std::vector 视为同一类型?
【发布时间】:2019-06-15 19:17:17
【问题描述】:

我有一个像这样定义的变量

auto drum = std::make_tuple
          ( std::make_tuple
          ( 0.3f
          , ExampleClass
          , [](ExampleClass& instance) {return instance.eGetter ();}
          )
          );

我希望drum 是一个元组的元组。 (即((a, b, c)))。

我还有一个像这样定义的变量

auto base = std::make_tuple
          ( 0.48f
          , ExampleClass
          , [](ExampleClass& instance) {return instance.eGetter ();}
          );

我希望它只是三个元素的元组(即(a, b, c)

我还有一个向量定义如下

std::vector<std::tuple<std::tuple< float
                                 , ExampleClass
                                 , std::function<float (ExampleClass&)>
                                 >>> listOfInstruments;

现在,如果我将 drum 添加到 listOfInstruments,我预计不会出现错误。

listOfInstruments.push_back(drum); 确实是这种情况

我预计会出现错误listOfInstuments.push_back(base);,但代码编译得很好。

由于listOfInstruments 的类型为'tuple of tuples',不应该只添加'tuple'会导致一些错误吗?除非()(()) 都被std::vector 视为相同类型。还是我完全错了,这里还有其他事情在起作用?

似乎无法弄清楚。

【问题讨论】:

  • 顺便说一句,我强烈建议您不要声明一个元素的std::tuple,而是使用元素类型。

标签: c++ tuples


【解决方案1】:

元组和向量在这里大多是红鲱鱼。工作方式很简单,push_back 与任何函数一样,可以对其参数执行隐式转换,如下面的工作 sn-p 所示:

#include <vector>

struct A { };

struct B {
    B(A const &) { }
};

int main() {
    std::vector<B> v;
    v.push_back(A{});
}

回到元组,我们可以看到它(除其他外)有一个条件显式构造函数 (#2 here),它引用元组的未来成员:

tuple( const Types&... args );

当且仅当所有成员都具有隐式复制构造函数时,此构造函数才是隐式的,这里就是这种情况(因为合成构造函数确实是隐式的)。这意味着 std::tuple&lt;...&gt; 可以隐式转换为 std::tuple&lt;std::tuple&lt;...&gt;&gt;,这就是您所观察到的。

【讨论】:

  • 那个构造函数是“有条件显式”的;您可能想解释为什么它在这种情况下是隐含的。
  • @Yakk-AdamNevraumont uuuh...我错过了那张纸条,但公平地说,我不明白为什么是我自己。
  • 关于条件显式构造函数的this question 链接可能会有所帮助。
  • @DanielJour 这就是实现这样一个构造函数的方式,但我不明白哪些类型可能会失败std::is_convertible&lt;const Ti&amp;, Ti&gt; 以及为什么在这种情况下构造函数显式是有意义的...
  • @Quentin 我相信如果Ti 的复制构造函数是显式的,那将会失败。因此,如果它的任何成员的复制构造函数是显式的,则该构造函数是显式的。
猜你喜欢
  • 2016-06-15
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多