加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 将“传递”函数模板作为generic-variadic lambda return语

发布时间:2020-12-16 10:04:12 所属栏目:百科 来源:网络整理
导读:尝试将函数模板作为模板模板参数传递时,我很开心.当然C不允许以这种方式传递函数模板.但我想出了简单的hax: #include iostream#define PASS_TEMPLATE(name) [](auto... args){return name(args...);}template typename T,typename Svoid function_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扩展或其他东西)

解决方法

我建议使用完美转发,但除此之外,它是完全可行的(并且可能除了手动输入之外唯一的除外)解决问题的方法.

那么,那将是:

#define PASS_TEMPLATE(name) [](auto&&... args){return name(decltype(args)(args)...);}

GCC was broken with generic stateless lambdas,所以你必须添加至少最小的状态,如[dummy = nullptr]或类似的东西.幸运的是他们修好了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读