2016-02-18 22 views
1

我有一個模板化的C++類,它作用於容器。在類實現中,我需要訪問容器包含的數據類型。我目前定義這樣的:模板類來管理容器,獲取包含數據的類型

template <typename ContainerType, typename DataType> 
class MyClass { 
    DataType a; 
    DataType foo(DataVector& vec, DataType s); 
}; 

當我實例化它,我將它實例化這樣

MyClass< vector<float>, float > c1; 
MyClass< CustomVector<double>, double > c2; 
MyClass< Lib::ContainerFloat, Lib::Float > c3; 

這工作,但有沒有這樣做,而不用複製的類型信息的一種方式(即浮動,雙等)?即使用一些類似decltype的魔法來獲取包含的數據類型。所以我想能夠與實例:

MyClass< vector<float> > c1; 
MyClass< CustomVector<double> > c2; 
MyClass<Lib::ContainerFloat> c3; 

,並聲明類:

template <typename ContainerType> 
class MyClass { 
    // get DataType automatically from ContainerType 
    DataType a; 
    DataType foo(DataVector& vec, DataType s); 
}; 
+0

不明白你的問題。你可以寫'DataType var = vector [0];',不是嗎? – songyuanyao

+0

我的問題是我如何避免重複有關數據類型的信息。即不是聲明它,而是從容器中提取,因爲它在編譯時已知。我編輯我的問題更清楚。 – memo

回答

4

作爲一個概念,所有容器都將支持value_type作爲一種類型。見http://en.cppreference.com/w/cpp/concept/Container

  1. std::vector
  2. std::list
  3. std::set
  4. std::multiset
  5. std::unordered_set
  6. std::queue
  7. 上次我檢查,value_type被支持

  8. std::array
  9. std::map
  10. std::unordered_map
  11. std::multimap
  12. std::stack
  13. std::priority_queue

我認爲它是安全供您使用:

template <typename ContainerType> 
class MyClass { 
    using DataType = ContainerType::value_type; 
}; 

MyClass< vector<float>> c1; 

如果DataType可以永遠不同於ContainerType::value_type,這將是更好地使用(由於是由於@AlexeyAndronov您的建議):

template <typename ContainerType, 
      typename DataType = ContainerType::value_type> 
class MyClass { 
}; 
+1

或更漂亮:'template class MyClass {};' –

+0

@AlexeyAndronov,很好的建議。 –

2

假設你使用的是標準庫容器模板,每個模板等爲其值類型定義了一個定義。在您自己的自定義容器中這也是一個很好的做法。

鑑於此定義可用,此模式應涵蓋您描述的用例。

template<class container> 
class MyClass{ 
public: 
    typename container::value_type a; 
};