【发布时间】:2020-11-07 17:05:32
【问题描述】:
我有许多类使用std::tie 从所有类属性中创建一个元组,并使用它来实现== 运算符。它们看起来像这样:
class S
{
int number;
std::string text;
// and many other attributes...
auto tied() const noexcept { return std::tie(/* list all attributes here */); }
bool operator==(const S &o) const noexcept
{
return tied() == o.tied();
}
};
这些类具有相似的方法,但属性非常不同,所以我想创建一个它们都继承自的基类,并且我想在基类中包含这一点比较。
但是,由于我无法定义返回 auto 的 virtual 方法,因此我正在努力编写一个抽象的泛型 tied() 方法,该方法应该从所有派生类的属性中生成一个元组,无论有多少它们或它们的类型。
这可行吗?
注意:所有属性都是普通类型或std::strings。
【问题讨论】:
-
不,这不可行。这听起来像是一个 XY 问题。您要解决的真正问题是什么?不,不是关于从班级成员制作元组的问题,而是您认为解决方案是从班级成员制作元组的问题,所以这就是您要问的问题。也许如果你解释你原来的问题,一个不同的解决方案就会变得非常明显。
-
如果您可以使用 C++20,那么可用于
operator==的 default 可能就是您正在寻找的。span> -
有“黑客”,比如 stackoverflow.com/q/39768517/1774667 ,但不是一般的。孩子们必须自己做这项工作来添加他们的方法。如前所述,
operator==(...) = default可能会做你想做的事。 -
与 python 不同,C++ 没有属性接口 (stackoverflow.com/questions/9058305/…)。 C++ 将承担更多的责任来实现这一点 - 它不是该语言的目标解决方案。
-
@SamVarshavchik 我有十几个具有相同模式的类:许多不同的属性和一个 == 运算符。这些类的对象代表参数集,当发生完全更新时,我只对至少一个参数已更改的对象感兴趣,因此进行比较。我正在尝试找到一种快速的方法来实现这一点,如果将来我需要添加一组新参数,我将只创建一个新类,其中所有新参数作为属性。然后从给我相同的比较机制的基类继承。
标签: c++