gpt4 book ai didi

c++ - C++中忽略的特征特化

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:54:48 24 4
gpt4 key购买 nike

我在用 C++ 实现 traits 时遇到了一些困难,我尝试按照互联网上的几个示例进行操作,但它仍然不想编译。

我使用 Term类,其中包含 Attribute , 一个 Operator有时是一个值。例如,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 中的值将取决于属性和运算符,因此我使用特征来获取正确的类型来存储值。

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 .

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

最佳答案

尽管 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com