C++ 在其他模板中使用任何类(类似于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) { } } 及 即

我已经实现了一个纯C++11 Any类,基于该类,它类似于boost::Any,如果直接使用,它可以很好地工作

但是,我现在需要使用它作为模板参数来为变量分配参数。看看这个:

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`
  }
};