C++ 在其他模板中使用任何类(类似于boost::Any)
我已经实现了一个纯C++11 Any类,基于该类,它类似于boost::Any,如果直接使用,它可以很好地工作 但是,我现在需要使用它作为模板参数来为变量分配参数。看看这个:C++ 在其他模板中使用任何类(类似于boost::Any),c++,c++11,C++,C++11,我已经实现了一个纯C++11 Any类,基于该类,它类似于boost::Any,如果直接使用,它可以很好地工作 但是,我现在需要使用它作为模板参数来为变量分配参数。看看这个: class A { IRecognizer<Any, Any> *_recognizer; template <typename T1, typename T2> A(IRecognizer<T1, T2> *x) : _recognizer(x) { } } 及 即
class A {
IRecognizer<Any, Any> *_recognizer;
template <typename T1, typename T2>
A(IRecognizer<T1, T2> *x) : _recognizer(x) {
}
}
及
即使我可以将每个模板参数分配给任意变量,但我不允许将IRecognizer分配给IRecognizer。这个问题有解决办法吗?错误消息是:
Cannot initialize a member subobject of type 'IRecognizer<Any, Any> *'
with an lvalue of type 'IRecognizer<Token *, ParserATNSimulator *> *'
<> P>我使用任何类的原因是,它有一个普通类型,可以用类似java对象的任何类引用赋值,C++没有其他类派生的公共对象类型。
这里可能有不同的方法吗?我愿意听取建议。您正在尝试将iReconverizer*转换为iReconverizer*。唯一允许的指针转换是从派生类指针到基类指针,即派生*到基类*或从更符合cv条件的指针到相同类型,即派生*到派生常量*或两者
iReceignizer与iReceignizer不在同一类层次结构中。它们是两种不相关的类型。如果有意义的话,您可以添加一个构造函数来将IRecognizer转换为IRecognizer,但不能为指针添加类似的内容 您正在尝试将iRecogniter*转换为iRecogniter*。唯一允许的指针转换是从派生类指针到基类指针,即派生*到基类*或从更符合cv条件的指针到相同类型,即派生*到派生常量*或两者
iReceignizer与iReceignizer不在同一类层次结构中。它们是两种不相关的类型。如果有意义的话,您可以添加一个构造函数来将IRecognizer转换为IRecognizer,但不能为指针添加类似的内容 指向X的指针与X不同 虽然可以将X转换为Y,但不能将指向X的指针转换为指向Y的指针 这里可能不需要指针。相反,您可能需要一个值 但是,接口不是一个值
java泛型不是C++模板。Java泛型Bob是围绕Bob的包装器-它实际上是在存储一个对象,在它上面的一个层中来回进行一系列包装转换
你可以在C++中写这样的包装器。例如:class IRecognizer_base {
public:
virtual int getState() = 0;
};
template<typename Symbol, typename ATNInterpreter>
class IRecognizer:public IRecognizer_base {
};
在这里,我们揭示了这样一个事实,即我们的对象实际上返回了一个Any,但在接口中我们将它们转换为Any
如果您根据模板类型公开了哪些操作实际上是不同的,那么您可以使用类型擦除策略来存储可以执行这些操作的任何内容,而不是指向特定类型的指针。指向X的指针与X的指针不同 虽然可以将X转换为Y,但不能将指向X的指针转换为指向Y的指针 这里可能不需要指针。相反,您可能需要一个值 但是,接口不是一个值
java泛型不是C++模板。Java泛型Bob是围绕Bob的包装器-它实际上是在存储一个对象,在它上面的一个层中来回进行一系列包装转换
你可以在C++中写这样的包装器。例如:class IRecognizer_base {
public:
virtual int getState() = 0;
};
template<typename Symbol, typename ATNInterpreter>
class IRecognizer:public IRecognizer_base {
};
在这里,我们揭示了这样一个事实,即我们的对象实际上返回了一个Any,但在接口中我们将它们转换为Any
如果您实际公开了基于模板类型的实际不同的操作,那么您可以使用类型擦除策略来存储任何可以执行这些操作的操作,而不是指向特定类型的指针。您确定存在适当的构造函数并且可以实例化吗?另外,请显示编译器错误。还有,什么是B?IRecognizer*和IRecognizer*是指向两种不同类型的指针,它们没有共同的基类,因此您不能将一个指针分配给另一个。您确定适当的构造函数存在并且可以实例化吗?另外,请显示编译器错误。还有,什么是B?IRecognizer*和IRecognizer*是指向两种不同类型的指针,它们没有共同的基类,因此不能将一个指针指定给另一个指针。
class IRecognizer_base {
public:
virtual Any getState_() = 0;
};
template<typename Symbol, typename ATNInterpreter>
class IRecognizer:public IRecognizer_base {
public:
inline Symbol getState() {
return getState_(); // whatever conversion required to go from `Any` to `Symbol`
}
};