gpt4 book ai didi

c++ - 选择模板化运算符实现

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:21:22 25 4
gpt4 key购买 nike

假设我们在自定义类上有一个operator/:

struct my_class {
uint64_t value;
}

template<class T>
constexpr T operator/(const my_class& a, const my_class& b)
{
return static_cast<T>(a.value) / static_cast<T>(b.value);
}

如何选择a/b(其中abmy_class类型)返回例如,intdouble

最佳答案

您可以使用一些模板魔术和转换运算符。您可以先为表达式定义一个简单的包装器:

struct DivideMyClass {
DivideMyClass(const MyClass& lhs_, const MyClass& rhs_) : lhs{lhs_}, rhs_{rhs} {}

template<typename T>
operator T () const {
return static_cast<T>(lhs.value) / static_cast<T>(rhs.value);
}

private:
const MyClass& lhs;
const MyClass& rhs;
};

然后,可以像这样重载运算符:

constexpr DivideMyClass operator/(const my_class& a, const my_class& b)
{
return DivideMyClass{a, b};
}

那么您的代码将如下所示:

double d = MyClass{21} / MyClass{5}; // will be equal to 4.2

为什么这个解决方案不好

该语言没有按返回类型重载除法。您的代码会使其他人认为存在错误而感到困惑。如果您广泛使用此方法,您将得到几乎不可读的代码。

另一件事,转换是隐式完成的,没有任何东西可以说明是否真的在调用站点的运算符中完成了转换。

您将阻止 AAA idom(几乎总是使用自动)。 auto 可能会破坏您的代码,这是一件坏事。

像这样的技术应该用于模板表达式和类似的东西。将其用于简单的除法会使其他人感到困惑。

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

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