gpt4 book ai didi

c++ - std::reference_wrapper 和多态容器

转载 作者:行者123 更新时间:2023-11-27 23:56:16 26 4
gpt4 key购买 nike

我正在尝试使用 std::reference_wrapper 制作多态 vector 对于这些类:

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)

但是您还需要某种多态分派(dispatch)来执行实际比较(假设动态类型匹配)。

关于c++ - std::reference_wrapper 和多态容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42449620/

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