我在用C++实现特征时遇到了一些困难,我尝试从Internet上遵循几个示例,但是它仍然不想编译。

我使用了Term类,该类包含AttributeOperator,有时还包含一个值。例如,age < 10color == red是(简单)术语。存在从类AttributeTermOperator继承的不同类型的属性或运算符。
由于term类的许多方法将取决于属性和运算符,因此这是模板类。为了简化术语的操作,我添加了一个抽象类:AbstractTerm

class AbstractTerm {
protected:
    Attribute* pAttribute;
    TermOperator* pOperator;
public:
    virtual bool eval(Data *) const = 0;
};

template <typename ATT, typename OP>
class Term : AbstractTerm {
    typedef typename TermTraits<ATT,OP>::type  VALUE_TYPE;
private:
    typename TermTraits<ATT,OP>::type value;
public:
    bool eval(Data *) const;
};

我需要存储在term中的值将取决于属性和运算符,因此我使用traits获取用于存储值的正确类型。
template < typename ATT, typename OP>
struct TermTraits
{
    typedef int type;
};

template <>
struct TermTraits<ListAttribute, TermOperator>
{
    typedef ListValue type;
};

template <>
struct TermTraits<NumericAttribute, TermOperator>
{
    typedef NumericIntValue type;
};

但是,在eval方法中,当我使用VALUE_TYPE时,我没有得到正确的类型
template <> bool Term<NumericAttribute, TermOperatorEquals>::eval(Data _data) const {
    // VALUE_TYPE is a int, but it should be a NumericIntValue
    VALUE_TYPE *pValue = data->getValue<VALUE_TYPE>(this->pAttribute->getId());
    return !pValue->isEmpty && (this->value == pValue->value); // I get compilation errors here because pValue is a int* and not a 'NumericIntValue*'
};

我得到错误:
error: request for member 'isEmpty' in '* pValue',
which is of non-class type 'Term<NumericAttribute,
TermOperatorExists>::VALUE_TYPE {aka int}.

我不知道为什么它不使用特化TermTraits<NumericAttribute, TermOperator>,因为TermOperatorExists继承自TermOperator

特质对我来说是一个新概念,所以也许我犯了一些明显的错误。如果有人有更好的方法或更简单的方法可以做到这一点,我也很感兴趣。

最佳答案

尽管TermOperatorExists继承自TermOperator,但它们是不同的类型,因此TermOperatorExists无需调用模板专门化。您需要将TermOperatorExists显式转换为它的基类,以便调用特殊化。

例:

#include <iostream>

using namespace std;

class base
{
};
class derrived: public base
{
};

class test
{
    public:
    template <class T> void print(T arg)
    {
        std::cout << "test" << std::endl;
    }
};

template <>
void test::print<base>(base arg)
{
    std::cout << "base specialiation" << std::endl;
};

int main()
{
   cout << "Hello World" << endl;
   base b;
   derrived d;


   test t;
    t.print<int>(1);
    t.print(b);
    t.print(d);
    t.print(static_cast<base>(d));
   return 0;
}

输出:
Hello World
test
base specialiation
test
base specialiation

关于c++ - C++中忽略的特质特化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21435989/

10-11 15:37