2016-08-23 60 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