首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >专攻函子返回类型

专攻函子返回类型
EN

Stack Overflow用户
提问于 2015-07-07 16:57:01
回答 2查看 330关注 0票数 0

对于模板化的成员函数,我有以下类型的签名,它接受一个泛型函式(无参数)作为它的唯一参数,并根据函子的返回类型返回容器类型:

代码语言:javascript
复制
template <typename Func,
          typename Traits = funcTraits<Func>,
          typename R = typename Traits::resultType >
Container<R> spawn(Func call);

我希望为具有空返回类型的函子创建此函数的专门化,如下所示:

代码语言:javascript
复制
template <typename Func,
          typename Traits = funcTraits<Func>,
          typename Traits::resultType == void >
Container<void> spawn(Func call);

这个是可能的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-07 17:03:46

不能专门化函数模板。

但是,可以使用SFINAE设置返回类型。标准一项:

代码语言:javascript
复制
template <typename Func,
          typename Traits = funcTraits<Func>,
          typename R = typename Traits::resultType >
typename std::enable_if<
    !std::is_void<R>::value,
    Container<R>
>::type
spawn(Func call);

void一张是:

代码语言:javascript
复制
template <typename Func,
          typename Traits = funcTraits<Func>,
          typename R = typename Traits::resultType >
typename std::enable_if<
    std::is_void<R>::value,
    Container<void>
>::type
spawn(Func call);
票数 2
EN

Stack Overflow用户

发布于 2015-07-07 17:03:47

不能对函数进行部分专门化,但可以使用struct:

代码语言:javascript
复制
namespace detail
{

    template <typename Func, typename Traits, typename R>
    struct impl
    {
        Container<R> operator() (Func call) { /*Default implementation*/ }
    };

    template <typename Func, typename Traits>
    struct impl<Func, Traits, void>
    {
        Container<void> operator() (Func call) { /*specialization*/ }
    };

}


template <typename Func,
          typename Traits = funcTraits<Func>,
          typename R = typename Traits::resultType >
auto spawn(Func call) { return detail::impl<Func, Traits, R>{}(call); }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31274881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档