c++ - 如何一次定义几个仅名称不同的函数(不使用宏)?
问题描述
我有一个简单的数学向量类,它基本上只是包装了一个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)
.
.
.
有没有非宏观的方法?
更新
我希望这些是自由函数,以允许通用模板代码,而不必关心类型是向量还是内置的。
解决方案
您将不得不使用宏来引入名称,但您可以缩短它的长度
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)
请注意,您可能会遇到在 中重新定义这些符号的问题::
,因此最好将其包装在命名空间中。
推荐阅读
- mono - 在 Visual Studio Mac 上构建项目时任务找不到“AxImp.exe”
- node.js - 如何删除cookie MEAN堆栈?
- powershell - 从文件名中删除多个连续句点
- javascript - 函数 row.add() 在我的函数中不起作用:
- sqlite - SQLite - 它会锁定表、数据库还是缓冲区?
- javascript - 使用javascript从客户端浏览器在powershell中执行FolderBrowserDialog
- java - 如何每 10 分钟向改造服务器发送一次发布请求?
- angular - 如何禁用表格行第一列的自定义指令操作?
- python - Python Decorator - 打印描述而不是名称
- r - 查找依赖于特定包的所有包