我怎样才能实现这样的目标:
//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
{
};
有可能吗?
答案 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 作为参数!