我确信这里的标题可能更具体,所以我鼓励任何有更好想法改变它的人。与此同时,我会尽力清楚这个问题。
我有一些像这样的抽象包装类:
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();
}
答案 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
}