是否可以使用运行时定义的模板参数?

时间:2018-08-15 17:28:30

标签: c++ templates

我有一个类,该类由内部模板类(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语句。有更通用的处理方法吗?

0 个答案:

没有答案