标准::reference_wrapper和多态容器
std::reference_wrapper and polymorphic containers
我正在尝试使用这些类使用std::reference_wrapper
制作多态向量:
struct Int2TypeBase{
virtual void which(){ std::cout << "Int2TypeBase" << "n";}
};
template <int v>
struct Int2Type : public Int2TypeBase
{
enum
{
value = v
};
void which(){ std::cout << "Int2Type<" << value << ">""n";}
friend bool operator==(const Int2Type& lhs, const Int2Type& rhs){
return lhs.v == rhs.v;
}
};
现在我正在尝试利用这样的std::reference_wrapper
:
int main(){
using namespace std;
std::vector<std::reference_wrapper<Int2TypeBase>> v;
Int2Type<0> i2t_1;
v.emplace_back(i2t_1);
auto x = v[0];
x.get().which();
std::cout << typeid(x.get()).name() << "n";
// std::cout << (x.get() == i2t_1) << "n";
}
输出为:
Int2Type<0>
8Int2TypeILi0EE
这就是我所期望的。
但是现在,当我取消评论时std::cout << (x.get() == i2t_1) << "n";
我会得到
invalid operands to binary expression ('Int2TypeBase' and 'Int2Type<0>')
这让我感到困惑,因为typeid(x.get()).name()
返回8Int2TypeILi0EE
而不是F12Int2TypeBasevE
这就是我得到的typeid(Int2TypeBase()).name();
。此外,which()
也为派生类调用...那么,为什么x.get()
x.get() == i2t_1
的评估结果是Int2TypeBase
呢?
您的比较运算符仅针对派生类定义,但引用包装器生成(静态)类型Int2Base
,因此重载分辨率甚至找不到您的比较运算符!
您可能需要的是表单的比较运算符
bool operator==(const Int2TypeBase& lhs, const Int2TypeBase& rhs)
但是,您还需要进行某种多态调度来执行实际比较(大概假设动态类型匹配)。
在编译时,编译器只能告诉 x.get() 的类型是 Int2TypeBase,因为正如声明的那样,您可以将任何 Int2TypeBase 放在那里。 因此,在编译时,它无法确定 == 运算符是否有效。
在运行时,放入集合中的对象引用其完整类型,因此 typeid 返回您期望的内容并调用正确的虚函数。
相关文章:
- 多态性和功能结合
- 具有默认模板参数的多态类的模板推导失败
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 多态二进制函数
- 访问存储在向量C++中的结构的多态成员
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 将 std::allocate_shared 与多态资源分配器一起使用
- 通过switch和static_cast访问多态对象的运行时类型
- C++boost序列化多态性问题
- 多态杆件变量 - 类设计
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- Doees the 'this' 指针参与虚函数的多态行为
- C++ 在堆栈中包含多态属性的类对象存储
- 基类和派生类的多态赋值运算符
- 转身多态对象
- 如何在基类指针向量的元素上应用重载的多态函数
- 具有智能指针的多态性
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- C++事件系统 - 多态事件和事件处理程序