当前位置:  开发笔记 > 编程语言 > 正文

分配值或回调函数的C ++重载模板

如何解决《分配值或回调函数的C++重载模板》经验,为你挑选了2个好方法。

尝试做类似...

template 
struct Wrapper
{
    template 
    void set(const U& u) { myT = u; }

    template 
    void set(F f) { myT = f(); }

    T myT;
};

我知道我需要在这里使用SFINAE,但是如何区分回调参数和值参数呢?可以安全地假定一个值不能用作回调。

我试着enable_ifis_function, result_ofinvoke_resultis_invocable,和其他人,但没有它的作品的权利。可能吗



1> Evg..:

您可以在不使用SFINAE的情况下进行操作:

template
void set(const U& u) { 
    if constexpr (std::is_invocable_v)
        myT = u();
    else
        myT = u;
}

或者以更通用的方式:

template
void set(U&& u) { 
    if constexpr (std::is_invocable_v)
        myT = std::forward(u)();
    else
        myT = std::forward(u);
}


因为更好的编译时间,所以比SFINAE更喜欢constexpr

2> songyuanyao..:

是的,您可以在std::is_invocable(自C ++ 17起)的帮助下应用SFINAE 。

template 
std::enable_if_t> set(const U& u) { myT = u; }

template 
std::enable_if_t> set(F f) { myT = f(); }

生活

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有