gpt4 book ai didi

c++ - 如何一次定义几个仅名称不同的函数(不使用宏)?

转载 作者:行者123 更新时间:2023-11-30 02:16:09 25 4
gpt4 key购买 nike

我有一个简单的数学 vector 类,它基本上只是包装一个 double数组。

现在我希望能够在此 vector 上按元素应用标准数学函数。例如。我的sqrt()实现看起来像这样:

MyVector sqrt(MyVector x) // side note: makes a copy of the input vector
{
for (double& d : x)
d = std::sqrt(d);
return x;
}

这很好用。我面临的问题是,我希望我的 vector 基本上可以用于 <cmath> 中的所有函数。有这个签名:double (*)(double) .

请注意,这些函数的实现与 sqrt() 中的一个相同 .唯一的区别是函数名称。

我目前的解决方案是一个宏:

#define DEFINE(function) \
MyVector function(MyVector x) \
{ \
for (double& d : x) \
d = std::function(d); \
return x; \
}

DEFINE(sqrt)
DEFINE(exp)
DEFINE(sin)
DEFINE(cos)
.
.
.

有没有非宏的方法?

更新

我希望这些是自由函数以允许通用模板代码,而不必关心类型是 vector 还是内置。

最佳答案

你将不得不使用宏来引入一个名字,但你可以减少它的长度

constexpr auto make_op(double(*op)(double))
{
return [op](MyVector x)
{
std::transform(std::begin(x), std::end(x), std::begin(x), op);
return x;
};
}

#define DEFINE(op) constexpr auto op = make_op(std::op);

DEFINE(sqrt)
DEFINE(exp)
DEFINE(sin)
DEFINE(cos)

请注意,您可能会遇到在 :: 中重新定义这些符号的问题,因此最好将其包装在命名空间中。

See it live!

关于c++ - 如何一次定义几个仅名称不同的函数(不使用宏)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55265172/

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