我在用C++实现特征时遇到了一些困难,我尝试从Internet上遵循几个示例,但是它仍然不想编译。
我使用了Term
类,该类包含Attribute
,Operator
,有时还包含一个值。例如,age < 10
或color == red
是(简单)术语。存在从类Attribute
或TermOperator
继承的不同类型的属性或运算符。
由于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/