作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
std::transform提供采用一元(一个参数)或二元(两个参数)可调用操作(通常为 lambda)的重载。
我想将我想要的可调用对象作为参数传递给父函数,并使用编译时(例如模板元编程)方法来自动选择 std::transform
中的哪一个根据传递的可调用对象是否具有带一或两个参数的函数签名,使用重载。
这是用(尚未工作)代码表达的所需方法:
#include <algorithm>
auto UnaryOp = [](const auto& src) { return src; }; // simple copy
auto BinaryOp = [](const auto& src1, const auto& src2) {return src1 + src2; }; // accumulate
auto GenericTransformer = [](auto src, auto dst, auto operation) { // operation is unary OR binary
/* unrelated code */
// need to chose this one:
std::transform(src.begin(), src.end(), dst.begin(), operation);
// or this one:
std::transform(src.begin(), src.end(), dst.begin(), dst.begin(), operation);
// depending on whether unary or binary operation is passed in 'operation' argument
/* unrelated code */
};
int main() {
std::vector<int> source_vec(100);
std::vector<int> dest_vec(100);
GenericTransformer(source_vec, dest_vec, UnaryOp); // i.e. copy source to destination
GenericTransformer(source_vec, dest_vec, BinaryOp); // i.e. accumulate source into destination
}
UnaryOp
和
BinaryOp
)——它们被传递给
GenericTransformer()
来自
main()
.
GenericTransformer()
,我可以使用什么编译时魔法来自动选择两者中的哪一个
std::transform()
根据
operation
的函数签名进行调用争论?
GenericTransformer()
分成两个独立的函数(一元函数和二进制函数),因为这会导致此处未显示的大量代码重复。坚持 DRY 理念!
最佳答案
使用 C++17,您可以混合使用 if constexpr
和 std::is_invocable
:
if constexpr (std::is_invocable_v<
decltype(operation), decltype(*src.begin())>) {
std::transform(src.begin(), src.end(), dst.begin(), operation);
}
else {
std::transform(src.begin(), src.end(), dst.begin(), dst.begin(), operation);
}
operation
在第二种情况下有效,但这需要额外的
else
分支以避免在(两个分支都无效)时消除编译时错误,这将需要一些
always_false
shenanigan .
关于c++ - 根据可调用的签名自动选择一元与二进制 std::transform 函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59534243/
在不使用 css 或 table 的情况下帮助 php 或 html 中的 div 新手。 尝试使用具有以下行为的 div 执行此 4 x 列、2 x 行 // [.....adjustable..
我有这个部分: 我想要实现的是让左边的跨度,右边的填充,然后是中间的 HR,右边的跨度和价格,但我想让价格对齐向右,并使 HR 可调,因此它始终以价格结束并在第一个跨度之后开始。无论我如何尝试,我都无
我是一名优秀的程序员,十分优秀!