我有一个类,该类由内部模板类(iterator
)和枚举(RVSignalInfo::DataType
)参数以及与此内部类相关的模板函数(getIterator
)组成:
class ProviderSignalPlotCurve : public QObject
{
// ...
template <RVSignalInfo::DataType DT>
class iterator
{
iterator(ProviderSignalPlotCurve* curve, quint64 begin, quint64 end) throw(WrongReadonlyPointerTypeException) {
throw WrongReadonlyPointerTypeException();
}
};
template<RVSignalInfo::DataType DT>
inline iterator<DT> getIterator(quint64 begin, quint64 end) {
return iterator<DT>(this, begin, end);
}
};
template<>
class ProviderSignalPlotCurve::iterator < RVSignalInfo::DataType::Float >
{
public:
iterator operator++() { ... }
iterator operator++(int) { ... }
// ...
private:
iterator(ProviderSignalPlotCurve* curve, quint64 begin, quint64 end)
: m_curve(curve), m_index(begin)
{
// ...
}
// ...
};
template<>
class ProviderSignalPlotCurve::iterator < RVSignalInfo::DataType::Double >
{
public:
iterator operator++() { ... }
iterator operator++(int) { ... }
// ...
private:
iterator(ProviderSignalPlotCurve* curve, quint64 begin, quint64 end)
: m_curve(curve), m_index(begin)
{
// ...
}
// ...
};
// ...
每个枚举成员都有自己专门的模板类。
如果我尝试创建iterator
的实例,则编译器会提供the value of 'dataType' is not usable in a constant expression
错误。我猜这是因为必须在运行时定义template参数。有办法解决这个问题吗?
RVSignalInfo::DataType dataType = curve->signalInfo()->dataType();
auto iterator = curve->getIterator<dataType>(visiblePartBegin, visiblePartEnd);
我发现了switch
语句的this解决方法,但是它看起来并不方便,因为每次添加或删除枚举成员时,都必须更改switch
语句。有更通用的处理方法吗?