将函数模板"pass"为泛型可变参数 lambda 返回语句是好方法吗?

Is it good approach to "pass" function template as generic-variadic lambda return statement?

本文关键字:语句 返回 方法 lambda 参数 pass 函数模板 泛型 变参      更新时间:2023-10-16

我很高兴尝试传递函数模板作为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]或类似的东西。幸好他们修好了。