2017-01-25 12 views
2

Я хочу получить шаблонный способ поиска, если тип является shared_ptr, и на основе этого я хочу получить новую специализацию функции.Как определить, является ли тип shared_ptr во время компиляции

Пример основной функцией является,

template <class T> inline 
void CEREAL_LOAD_FUNCTION_NAME(RelaxedJSONInputArchive & ar, NameValuePair<T> & t) 
{ 
    std::cout << " CEREAL_LOAD_FUNCTION_NAME NameValuePair 1 " << std::endl; 
    ar.setNextName(t.name); 
    ar(t.value); 
} 

Если t.value является shared_ptr, то я хочу иметь другую функцию специализации. Я попытался ниже,

template <class T> inline 
typename std::enable_if<is_pointer<T>::value, void>::type 
CEREAL_LOAD_FUNCTION_NAME(RelaxedJSONInputArchive & ar, NameValuePair<T> & t) 
{ 
    std::cout << " CEREAL_LOAD_FUNCTION_NAME NameValuePair 2 " << std::endl; 
    ar.setNextName(t.name); 
    ar(t.value); 
    } 

Но это не похоже на работу. Они входят в библиотеку C++ 11 cereal. Который я пытаюсь настроить.

+0

ли 'NameValuePair' иметь тип элемента, говоря вам, что' t.value' это? – TartanLlama

+0

NameValuePair определяется здесь. https://uscilab.github.io/cereal/assets/doxygen/helpers_8hpp_source.html .it имеет член значения типа. –

+0

«прямая» перегрузка должна работать, см. Http://coliru.stacked-crooked.com/a/db3eae53e609bcfc – sp2danny

ответ

6

следующее может помочь:

template<typename T> struct is_shared_ptr : std::false_type {}; 
template<typename T> struct is_shared_ptr<std::shared_ptr<T>> : std::true_type {}; 

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

template <class T> 
typename std::enable_if<is_shared_ptr<decltype(std::declval<T>().value)>::value, void>::type 
func(T t) 
{ 
    std::cout << "shared ptr" << std::endl; 
} 

template <class T> 
typename std::enable_if<!is_shared_ptr<decltype(std::declval<T>().value)>::value, void>::type 
func(T t) 
{ 
    std::cout << "non shared" << std::endl; 
} 

live demo

+0

Будет ли это работать в моем случае. На самом деле мне нужно получить новую специализацию функции, основанную на типе члена, называемого значением. Если значение T :: равно shared_ptr, мне нужна новая специализация. –

+0

У меня есть обновленный ответ, чтобы включить SFINAE в .value –

4

Это базовый случай template specialization. Ниже приведен тип, который определяет, является ли тип T shared_ptr или нет. Его можно использовать так же std::is_pointer, который вы уже используете.

#include <memory> 
#include <type_traits> 

template<class T> 
struct is_shared_ptr : std::false_type {}; 

template<class T> 
struct is_shared_ptr<std::shared_ptr<T>> : std::true_type {}; 

Демонстрация:

static_assert(is_shared_ptr<std::shared_ptr<int>>::value == true, ""); 
static_assert(is_shared_ptr<int>::value == false, ""); 

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

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