这是通过"传递"函数模板为generic-variadic lambda return语句?

时间:2016-10-08 13:45:03

标签: c++ templates lambda c++14

我很乐意尝试将函数模板作为template template参数传递。当然,C ++不允许以这种方式传递函数模板。但我想出了简单的hax:

#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);
}

Demo

问题是:

  • 这是可行的方法吗? (它是否安全?没有角落案件?)
  • 它是通用的,还是会导致编译失败的情况?
  • 还有其他替代方案吗? (我知道有些人不喜欢宏)

我只是在GCC 6.1.0上进行测试(我真的希望它不是GCC扩展或其他东西)

2 个答案:

答案 0 :(得分:4)

没关系,你可能想要启用完美转发:

mov cx, 1      ;Repetition count
mov al, " "    ;Character code
mov bh, 0      ;Display page
mov ah, 0Ah    ;Function number
int 10h

答案 1 :(得分:3)

我建议使用完美的转发功能,但除此之外,它是完全可行的(并且除了手动输入所有内容之外可能除此之外)解决问题。

所以,那将是:

component

GCC was broken with generic stateless lambdas,因此您必须添加至少最小的状态,例如#define PASS_TEMPLATE(name) [](auto&&... args){return name(decltype(args)(args)...);} 或类似的东西。幸运的是他们修好了。