2015-07-07 6 views
0

У меня есть следующий тип подписи для шаблонных функций-членов, который принимает общий Functor (без параметров) в качестве своего единственного аргумента и возвращает тип контейнера на основе возвратного типа функтора:Специализируются на функтор обратного типа

template <typename Func, 
      typename Traits = funcTraits<Func>, 
      typename R = typename Traits::resultType > 
Container<R> spawn(Func call); 

Я ищу, чтобы создать специализацию этой функции для функторов, которые имеют тип возврата недействительным, то вдоль линий:

template <typename Func, 
      typename Traits = funcTraits<Func>, 
      typename Traits::resultType == void > 
Container<void> spawn(Func call); 

возможно ли это?

ответ

2

Вы не можете специализировать шаблоны функций.

Вы можете использовать SFINAE для установки типов возврата. Стандартна:

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); 
1

Вы не можете частичную специализацию функции, но вы можете с структурой:

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

 Смежные вопросы

  • Нет связанных вопросов^_^