2013-03-01 109 views
5

考慮實現一種容器,其包括用於選擇其存儲位置的選項的類模板。避免重複模板參數類模板訪問枚舉

template<class T> 
class Container { 
public: 
    enum StorageOption {A,B}; 
    Container(StorageOption opt_): option(opt_) {} 
private: 
    StorageOption option; 
}; 

這裏StorageOption被選擇是一個部件,因爲它是在類僅使用。

現在,實例化的類,我需要重複模板參數,如:

{ 
    Container<int> c(Container<int>::A); 
} 

有沒有一種方法,以避免重複參數,並在同一時間有StorageOption是成員還是有實施該選項的更好方法是什麼?

+0

我看不出hmjd的想法可能可能工作。 – 2013-03-01 14:57:49

+0

你有沒有嘗試過這種'使用類型=容器 :: StorageOption'? – 2016-08-10 06:27:58

+0

有一個醜陋的解決方案,您可以將該枚舉從類中取出並命名爲ContainerStorageOption。 – 2017-04-13 07:48:19

回答

7

它通常是由在基類定義它來實現的。

class ContainerBase { 
public: 
    enum StorageOption {A,B}; 
}; 


template<class T> 
class Container : public ContainerBase{ 
public: 
    Container(StorageOption opt_): option(opt_) {} 
private: 
    StorageOption option; 
}; 

Container<int> c(ContainerBase::A); 
+0

對!我總是在思考一個像這種多態是錘子一樣小的東西。但我想這就是C++的意思。 – ritter 2013-03-01 14:58:30

+0

@Frank,沒有多態性,'ContainerBase'不是多態的 – 2013-03-01 14:59:29

+0

再次正確。這只是組成。好點子! – ritter 2013-03-01 15:00:13

0

我一直在爭奪這個問題我自己,我真的不喜歡需要一個基類,以及想要使用枚舉類時,你需要如何重複基類說明。我想出了這個解決方案:

namespace FuncEnum{ 
    enum class FuncNeighbor{ 
     FLOOR, CEILING, SELF 
    }; 
    enum class FuncDirection{ 
     BACK, FRONT, BACKNFRONT 
    }; 
    enum class FuncVar{ 
     X, Y 
    }; 
} using namespace FuncEnum; 

template<typename... Types> 
class Func {}; 

這樣你就可以有最小規範的全局可用枚舉類。這是不太可能的碰撞之間<類的綽號> <枚舉類的名字恰好>但即使有,using聲明應該影子(?)無論全局標識符約干涉(在一個特殊的情況下,可以再次與其他使用被撤銷宣言)。