Сфины и шаблонная специализация - PullRequest
3 голосов
/ 08 марта 2020

Я хочу предоставить функцию в моей библиотеке:

namespace Foo {
template<typename G>
typename std::enable_if<std::is_fundamental<G>::value, std::vector<uint8_t>>::type toBytes(const G &g) {
//something here
}
}

Однако я хочу предоставить базовую c реализацию только для базовых c типов. Если пользователь хочет добавить специализацию, я думаю, что было достаточно написать код пользователя:

namespace Foo {
template<>
std::vector<uint8_t> toBytes<struct A>(const struct A &g) {
//something here
}
}

Однако, он не компилируется, G cc выдает эту ошибку:

std :: vector Foo :: toBytes (const A &) 'не соответствует ни одному объявлению шаблона

Я что-то пропустил?

1 Ответ

1 голос
/ 08 марта 2020

Я бы использовал функцию C ++ 20 Concept. Concept s, естественно, также поддерживает специализацию шаблонов:

#include <iostream>

namespace detail {
    template<typename T, typename U >
    concept SameHelper = std::is_same_v<T, U>;
}

template<typename T, typename U >
concept same_as = detail::SameHelper<T, U> && detail::SameHelper<U, T>;

template<typename T>
concept fundamental = same_as<T, bool> || same_as<T, char>;

template<typename T>
void toBytes(T) {std::cout << "I am not fundamental" << std::endl;}  

template<fundamental T>
void toBytes(T){std::cout << "I am fundamental" << std::endl;}


int main() {
    toBytes(true);
    toBytes('c');
    toBytes(1);
}

Вы можете запустить код онлайн для см. следующий вывод:

I am fundamental
I am fundamental
I am not fundamental
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...