当前位置:  开发笔记 > 编程语言 > 正文

std ::成员指针行为的元组

如何解决《std::成员指针行为的元组》经验,为你挑选了1个好方法。

我想了解这种行为的原因:

这段代码很完美:

#include 
#include 

struct SomeClass {
 int v1;
 int v2;
 int v3;
};


auto pv1 = &SomeClass::v1;
auto pv2 = &SomeClass::v2;
auto pv3 = &SomeClass::v3;

auto t = std::tie(pv1, pv2, pv3);

int main() {

  SomeClass c;
  c.v1 = 111;
  c.v2 = 222;
  c.v3 = 333;

  std::cout << c.*std::get<0>(t) << std::endl << c.*std::get<1>(t) << std::endl << c.*std::get<2>(t) << std::endl;
}

但这不编译

#include 
#include 

struct SomeClass {
 int v1;
 int v2;
 int v3;
};

auto t = std::tie(&SomeClass::v1, &SomeClass::v2, &SomeClass::v3);

int main() {

  SomeClass c;
  c.v1 = 111;
  c.v2 = 222;
  c.v3 = 333;

  std::cout << c.*std::get<0>(t) << std::endl << c.*std::get<1>(t) << std::endl << c.*std::get<2>(t) << std::endl;
}

在gcc中出现以下错误

test.cpp:17:65: error: invalid initialization of non-const reference of type ‘int SomeClass::*&’ from an rvalue of type ‘int SomeClass::*’
 auto t = std::tie(&SomeClass::v1, &SomeClass::v2, &SomeClass::v3);
                                                                 ^
In file included from test.cpp:2:0:
/usr/include/c++/4.8/tuple:1044:5: error: in passing argument 1 of ‘std::tuple<_Elements& ...> std::tie(_Elements& ...) [with _Elements = {int SomeClass::*, int SomeClass::*, int SomeClass::*}]’
     tie(_Elements&... __args) noexcept
     ^

背景问题: 正如你可以怀疑的那样,我想把元组中某些类的一些成员组合起来做一些模板魔法.



1> Shafik Yaghm..:

如果我们查看std :: tie的cppreference文档,它会说(强调我的):

template< class... Types >
tuple tie( Types&... args );

创建一个对其参数或std :: ignore实例的左值引用元组.

在第一种情况下pv1,pv2并且pv3都是左值,因此将非常量左值引用绑定到它们是有效的.

在第二种情况下,您传递rvalues,因此您不能将非const左值引用绑定到它们.你可以使用std :: make_tuple来完成这项工作:

auto t = std::make_tuple(&SomeClass::v1, &SomeClass::v2, &SomeClass::v3);

我们可以看到将rvalue引用传递给make_tuple:

template< class... Types >
tuple make_tuple( Types&&... args );
                                  ^^

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有