Тип-зависимая специализация шаблонной функции - PullRequest
0 голосов
/ 03 июля 2018

У меня есть простая шаблонная функция, определенная в библиотеке, которую я использую

template<class T>
T create(std::vector<char>& data)
{ 
    T newValue{}; 
    /* Do something with data */
    return newValue;
}

и я хочу специализировать эту функцию в случае, если T реализует определенный интерфейс

template<class T>
std::enable_if_t<std::is_base_of<Interface, T>::value, T> create( std::vector<char>& data)
{ 
    T newValue{};
    newValue.InterfaceFunction(data);
    return newValue;
}

но я не могу сделать эту работу, специализированная функция не используется. Как я могу добиться специализации уже определенной шаблонной функции?

1 Ответ

0 голосов
/ 03 июля 2018

Это не специализация шаблонов, а перегрузка шаблонов, и шаблоны функций не могут быть частично специализированными. Проблема заключается в том, что при указании типа, производного от Interface, оба шаблона функций точно совпадают, что приводит к неоднозначности.

Вы можете подать заявку SFINAE .

template<class T>
std::enable_if_t<!std::is_base_of<Interface, T>::value, T> create(std::vector<char>& data)
{ 
    T newValue{}; 
    /* Do something with data */
    return newValue;
}

template<class T>
std::enable_if_t<std::is_base_of<Interface, T>::value, T> create( std::vector<char>& data)
{ 
    T newValue{};
    newValue.InterfaceFunction(data);
    return newValue;
}

ЖИТЬ

...