避免重复模板参数类模板访问枚举

问题描述:

考虑实现一种容器,其包括用于选择其存储位置的选项的类模板。避免重复模板参数类模板访问枚举

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

它通常是由在基类定义它来实现的。

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

我一直在争夺这个问题我自己,我真的不喜欢需要一个基类,以及想要使用枚举类时,你需要如何重复基类说明。我想出了这个解决方案:

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声明应该影子(?)无论全局标识符约干涉(在一个特殊的情况下,可以再次与其他使用被撤销宣言)。