2016-08-23 28 views
-2

的载体的成员,我有两个类1.4.3类

class MyStoreClass 
{ 
public: 
    std::vector<std::unique_ptr<MyClass>> my_vec; 
}; 

class MyClass 
{ 
public: 
    double member1; 
    int member2; 
}; 

我有大约10000 MyClasses 的向量我想能够使用的功能,例如as

template<typename T> 
void MyStoreClass::output_member(T MyClass::* chosen_member) 
{ 
    std::cout << chosen_member << std::endl; 
} 

我不确定该从哪里出发。

编辑:我想在矢量

+0

类似'chosen_member-> MemberVariable?' –

+0

也许读了指向成员的指针? – LogicStuff

+0

我猜''chosen_member'你试图在'member1'和'member2'之间进行选择? –

回答

1

你忘了描述什么功能应该输出member从每个MyClass的,所以我假设你想打印相应的成员函数所有元素的my_vec

您需要明确取消引用unique_ptr才能使用指向成员的解引用操作符。
其余部分很简单:

template<typename T> 
void MyStoreClass::output_member(T MyClass::* chosen_member) 
{ 
    for (const auto& ptr: my_vec) 
    { 
     if (ptr) 
      std::cout << (*ptr).*chosen_member << std::endl; 
     else 
      std::cout << "[null]" << std::endl; 
    } 
} 

与假设的继续,我会认为是“标准的”你的意思是“预C++ 11循环,我已经习惯了“,因为基于范围的回路现在已经是标准的几年了。

template<typename T> 
void MyStoreClass::output_member(T MyClass::* chosen_member) 
{ 
    for (std::vector<std::unique_ptr<MyClass>>::const_iterator i = my_vec.begin(); 
     i != my_vec.end(); 
     ++i) 
    { 
     if (*i) 
      std::cout << (*i)->*chosen_member << std::endl; 
     else 
      std::cout << "[null]" << std::endl; 
    } 
} 
+0

对null的测试是'* ptr'(它给出了一个'std :: unique_ptr & ')而不是'ptr'(它测试迭代器本身)。输出将是'(* ptr) - > * chosen_member'。 – Peter

+1

@Peter否,'ptr'不是迭代器。这是'const std :: unique_ptr &'。 – molbdnilo

+0

我将如何去输出所选成员的循环标准? – oxidising