将函数模板"pass"为泛型可变参数 lambda 返回语句是好方法吗?
Is it good approach to "pass" function template as generic-variadic lambda return statement?
我很高兴尝试传递函数模板作为template template
参数。当然,c++不允许以这种方式传递函数模板。但我想到了一个简单的例子:
#include <iostream>
#define PASS_TEMPLATE(name) [](auto&... args){return name(args...);}
template <typename T, typename S>
void function_template(T t, S s) {std::cout << t << ' ' << s << std::endl;}
template <typename Hax, typename T, typename S>
auto test(Hax hax, T t, S s)
{
return hax(t, s);
}
int main()
{
test(PASS_TEMPLATE(function_template), 1, 1.5);
}
演示问题是:
- 这个方法可行吗?(安全吗?没有极端情况?)
- 是通用的吗,还是存在导致编译失败的情况?
- 是否有其他替代方案来实现这一点?(我知道有些人不喜欢宏)
我只在GCC 6.1.0上进行了测试(我真的希望它不是GCC扩展或其他什么)
这很好,除非您可能希望启用完全转发:
#define PASS_TEMPLATE(name) [](auto&&... args){return name(std::forward<decltype(args)>(args)...);}
我建议使用完全转发,但除此之外,这是一种完全可行的(可能是除了手动输入所有内容之外的唯一方法)解决问题的方法。
也就是:
#define PASS_TEMPLATE(name) [](auto&&... args){return name(decltype(args)(args)...);}
GCC被通用的无状态lambdas破坏了,所以你必须添加至少最小的状态,如[dummy=nullptr]
或类似的东西。幸好他们修好了。
相关文章:
- 返回语句后的代码,没有警告
- 三元运算符在返回语句中给出意外的结果
- 返回非 void 的函数中没有返回语句警告
- 如何使用单个返回语句返回对变量的引用
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 获取上次执行的返回语句的行
- 如果语句错误地读取字符串,则始终在第一个条件返回
- 如何在 c++ 中从 switch 语句返回不同类型的变量
- Qt SQL LIKE语句返回错误
- C++如果使用 lambda 表达式的语句返回 true,但输出来自 false,为什么
- 为什么返回语句和打印语句返回不同的答案?
- if-else 语句返回相同的反馈
- 为什么此范围基于语句返回一个数字太低的范围
- C++选择语句返回 true
- C++开关语句返回奇怪的值
- 这个语句返回什么
- 空的C++if语句返回零值
- 从if语句返回数据
- If语句返回错误的输出C++
- 返回语句返回一个空指针值而不是期望的值