专注于函子 return 类型
Specialize on functor return type
我有以下模板化成员函数的类型签名,它接受泛型 Functor(无参数)作为其唯一参数,returns 是基于 return 类型的 Container 类型仿函数:
template <typename Func,
typename Traits = funcTraits<Func>,
typename R = typename Traits::resultType >
Container<R> spawn(Func call);
我希望为具有 void return 类型的 Functors 创建此函数的专门化,类似于:
template <typename Func,
typename Traits = funcTraits<Func>,
typename Traits::resultType == void >
Container<void> spawn(Func call);
这可能吗?
您不能特化函数模板。
但是您可以使用 SFINAE 来设置 return 类型。标准的:
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
一个:
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);
你不能部分特化一个函数,但你可以使用结构:
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); }
我有以下模板化成员函数的类型签名,它接受泛型 Functor(无参数)作为其唯一参数,returns 是基于 return 类型的 Container 类型仿函数:
template <typename Func,
typename Traits = funcTraits<Func>,
typename R = typename Traits::resultType >
Container<R> spawn(Func call);
我希望为具有 void return 类型的 Functors 创建此函数的专门化,类似于:
template <typename Func,
typename Traits = funcTraits<Func>,
typename Traits::resultType == void >
Container<void> spawn(Func call);
这可能吗?
您不能特化函数模板。
但是您可以使用 SFINAE 来设置 return 类型。标准的:
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
一个:
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);
你不能部分特化一个函数,但你可以使用结构:
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); }