gpt4 book ai didi

c++ - 模板化运算符 ==

转载 作者:行者123 更新时间:2023-11-30 03:19:53 25 4
gpt4 key购买 nike

我有一个本质上是包含 std::map 的类,其中值是 shared_ptrs 包装一个包含不同类型的容器。骨架代码如下:

// Just a basic example class
class MyClass {
public:
explicit MyClass(int i) : mI(i) {}
bool operator==(const MyClass& rhs) { return mI == rhs.mI; }
private:
int mI;
};

// A class into which key value pairs can be added where the value
// can be of a different type.
class MultipleTypeMap {

public:

template <typename T>
void AddObject(const std::string& key, const T object) {
auto ptr = make_shared<B<MyClass>>(std::move(object));
mSharedPtrMap.insert(pair<string, shared_ptr<A>>("key", ptr));
}
// ...

private:

class A {
public:
virtual ~A() = default;
};

template<typename T>
class B : public A {
public:
explicit B(const T& t) : item(t) {}
const T item;
};

map<string, shared_ptr<A>> mSharedPtrMap;
};

int main() {

MyClass m(1);
MultipleTypeMap multiMap;
multiMap.AddObject("test", m);

MyClass n(1);
MultipleTypeMap multiMap2;
multiMap2.AddObject("test", n);

if (multiMap == multiMap2) {
cout << "Equal" << endl;
}

return 0;
}

应该如何编写 MultipleTypeMap 的通用 == 运算符,以便通过检查 lhs 和 rhs 对象是否具有相同数量的键、相同的键和相同的对象来比较 mSharedPtrMap 的内容,其中相同意味着== 键/对象的运算符计算结果为真?

最佳答案

如果您键入删除(后来不知道您之前存储的是哪种类型),那么所有功能都必须由基类接口(interface)提供。因此,我们需要在每个 B 中实现的 A 中的虚拟 operator==

这是一个实现:

class MultipleTypeMap {

public:
template <typename T>
void AddObject(const std::string& key, T object) {
auto ptr = std::make_unique<B<T>>(std::move(object));
mMap.emplace(key, std::move(ptr));
}
// ...

bool operator==(const MultipleTypeMap& other) const
{
// Sizes must be equal.
if (mMap.size() != other.mMap.size())
return false;

// Sizes are equal, check keys and values in order.
auto itOther = other.mMap.begin();
for (auto it = mMap.begin(); it != mMap.end(); ++it, ++itOther)
{
if (it->first != itOther->first)
return false;
if (*it->second != *itOther->second)
return false;
}
// No differences found.
return true;
}
bool operator!=(const MultipleTypeMap& rhs) const { return !(*this == rhs); }

private:

class A {
public:
virtual ~A() = default;

virtual bool operator==(const A& other) const = 0;
bool operator!=(const A& other) const { return !(*this == other); }
};

template<typename T>
class B : public A
{
public:
explicit B(const T& t) : item(t) {}

bool operator==(const A& other) const override
{
const B<T>* otherB = dynamic_cast<const B<T>*>(&other);
// If the cast fails, types are different.
if (!otherB)
return false;
// Note: The above is probably slow, consider storing (on construction)
// and checking typeids instead.

// Check item equality.
return item == otherB->item;
}

const T item;
};

std::map<std::string, std::unique_ptr<A>> mMap;
};

Demo with tests

注意:我没有修复原始代码中的所有不一致之处。 (你想移动还是复制构造你的 T?当你的 MyClass 比较运算符不是 const< 时,为什么要存储 const 对象?)

关于c++ - 模板化运算符 ==,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53337742/

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