级联C++模板用法

Cascading C++ Templates Usage

本文关键字:用法 C++ 级联      更新时间:2023-10-16

我有两个类:

  1. ValueRange
  2. 菜单项

第三个类Menu使用MenuItem类定义多个菜单项,每个菜单项都有一系列值(int、float、boolean)。

我所做的是:

template <class T>
class ValueRange{
    private:
        T minValue;
        T maxValue;         
    public:
        void setMinValue(T minValue){this->minValue=minValue;};
        void setMaxValue(T maxValue){this->maxValue=maxValue;};
        ValueRange(){};
        ~ValueRange(){};
};

#include <string>
#include "ValueRange.hh"
class MenuItem{
    private:
      std::string name;
      /*
       * does not compile...
       * error: invalid use of template-name 'ValueRange' 
       * without an argument list
       * error: 'ValueRange' is not a type
       */
      ValueRange value;
    public:
      /*
       * does not compile...
       * error: 'class MenuItem' has no member named 'value' 
       */
      void setValueRange(ValueRange value){this->value=value;}
      MenuItem(){};
      ~MenuItem(){};
};

如何实现类MenuItem,使其属性值是泛型的,这样我就可以拥有值范围为int、float、boolean等的menuItems。?

C++中的类模板需要实例化。例如:
ValueRange<int>

是有效的类型。

ValueRange

没有类型就不是。

要实现通用MenuItem,您可以将MenuItem作为模板类,也可以将ValueRange扩展为非模板基类,例如:

class ValueRangeBase { /* some virtual members here... */ };
template <class T>
class ValueRange : public ValueRangeBase { /* same as before */ };

然后可以使用ValueRangeBase(但不是按值)作为泛型ValueRange。这在某些时候很有用,但可能不是你想要的。

只需将MenuItem参数化为与ValueRange:相同

template<class T>
class MenuItem
{
   ...
   ValueRange<T> value;
   ...
   void setValueRange(ValueRange<T> value) { ... }
   ...
};