从以前的模板参数获取类型

时间:2011-04-02 17:02:20

标签: c++ templates

我怎样才能实现这样的目标:

//where Low's parameter is of a type of Range's first parameter  
Range<char,Low<5>> range; 

这里的问题我看到我希望/喜欢Low类型让他们的参数依赖于Range的第一个参数,例如:

template<class IntType,class LowType>
struct Range
{
};

并且:

template<class T>//how to do it that this parameter is of a type of Ranges first parameter?
struct Low
{
};

有可能吗?

3 个答案:

答案 0 :(得分:3)

部分专业化将为您完成任务:

template<class IntType, class LowType>
struct Range;
                               //vvvvv
template<class IntType, template<class, IntType> class LowType, IntType N>
struct Range< IntType, LowType<IntType, N> >{
                             //^^^^^^^
  // implementation here
};

修改
它适用于上面显示的一些更改,但您需要更改Low结构模板:

template<class IntType, IntType N>
struct Low{
};

使用它显示here on Ideone。但问题出现了:为什么你需要一个额外的Low结构?以下不足以满足要求吗?

template<class IntType, IntType Low>
struct Range;

如果您真的需要Low结构,您可以随时执行以下操作(使用上面显示的Low结构):

template<class IntType, IntType LowNum>
struct Range{
  typedef Low<IntType,LowNum> LowType;
  // ...
};

并像Range<int,5>一样使用它,在内部使用Range结构的同时,使Low方式对用户更方便。

答案 1 :(得分:1)

虽然我不相信我理解你的目标,但我发布了这个 如果这可能是你的一些提示。 如果允许某些修改,则以下设置可能符合以下目的:

template< class T, T V > struct Low {
  typedef T underlying_type;
};

template< class T > struct Range {
  typedef typename T::underlying_type value_type; // example
};

Range< Low<char,5> > range;

希望这有帮助

答案 2 :(得分:0)

Range类模板的第二个参数应写为,

template<class IntType, template<int N> class LowType>
struct Range          //^^^^^^^^^^^^^^ note this!
{
};

Low类模板定义为

template<int N>  //note the difference!
struct Low
{
};

注意:Low类模板将整数常量,而不是 type 作为参数!