首页 > 解决方案 > 如何一次定义几个仅名称不同的函数(不使用宏)?

问题描述

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

现在我希望能够在这个向量上按元素应用标准数学函数。例如,我的sqrt()实现如下所示:

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

这工作正常。我面临的问题是,我希望我的向量基本上可以用于<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)
.
.
.

有没有非宏观的方法?

更新

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

标签: c++c++17

解决方案


您将不得不使用宏来引入名称,但您可以缩短它的长度

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)

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

现场观看!


推荐阅读