我可以访问嵌套模板C ++的类型

时间:2016-05-03 11:11:47

标签: c++ templates

我确信这里的标题可能更具体,所以我鼓励任何有更好想法改变它的人。与此同时,我会尽力清楚这个问题。

我有一些像这样的抽象包装类:

class Attribute{
public:
    static const std::string name;
    Attribute() {
    virtual ~Attribute() {}
    virtual void calculateAttribute() = 0;
}

template <typename AttType> class TypedAttribute: public Attribute{
public:
    static const std::string name;
    TypedAttribute() {}
    virtual ~TypedAttribute() {}
    virtual void calculateAttribute() = 0; 
    AttType &value();
}

之后,特定属性继承自TypedAttribute,例如:

class AreaAttribute : public TypedAttribute<int> {
public:
    static const std::string name = "area";
...
}

class EntropyAttribute : public TypedAttribute <double> {
public:
    static const std::string name = "area";    
...
}

最后,我有一个模板化函数,它应该为一系列值找到一个最大值(最初为最小值和最大值,但为了简洁起见),如下所示:

template <typename TAT>
int Node::minAttribute(const std::vector <MyObject *> &items) const{
// all attributes always positive scalar values

    int minVal = -1;
    for (int i=0; i < (int)items.size(); ++i)
        int v = ((TAT *)items[i]->getAttribute(TAT::name))->value();
        if (minVal == -1 || v < minVal)
            minVal = v;

    return minVal;
}

使用示例minAttribute<AreaAttribute>(myItems);

但是,这样做不允许我知道如何键入TypedAttribute,并且我不得不总是返回int值。有没有办法访问曾经能够模板函数返回值的TypedAttribute类型?像这样的东西(我知道这种语法不起作用):

template <typename TYP>
template <class TypedAttribute< TYP > TAT>
TYP minAttribute(const std::vector <MyObject *> &items) const{

    // example line:
    TYP v = ((TAT *)items[i]->getAttribute(TAT::name))->value();

}

1 个答案:

答案 0 :(得分:1)

typedef或在TypedAttribute类中使用会使该类可用。

template <typename AttType>
class TypedAttribute: public Attribute
{
    public:    
    using AttributeType = AttType; 
    //can use a typedef for older versions of C++

    //...
};

然后使用此更改minAttribute函数返回该类型: -

template <typename TAT>
typename TAT::AttributeType Node::minAttribute(const std::vector <MyObject *> &items) const
{
   // can return TAT::AttributeType instead of int
   // will need a < operator than can be used with TAT::AttributeType
}