Предположим, у меня есть шаблон is_my_tag<T>
, который разрешается в true_type
или false_type
, в зависимости от T.
struct my_tag;
template<class Tags> struct is_my_tag : std::false_type {};
template<> struct is_my_tag<my_tag> : std::true_type {};
template<class... Tags> struct is_my_tag<std::tuple<my_tag, Tags...>> : std::true_type {};
В библиотеке существует некоторая шаблонная функция:
template<class T>
std::string fun(const T& ctx) {
return "base";
}
Хочу специализировать его по типам, для которых is_my_tag<T> == true_type
.
Я попробовал этот код, но он не скомпилировался, сообщая о «неоднозначном определении»:
template<class T, typename = std::enable_if_t<is_my_tag<T>::value>>
std::string fun(const T& ctx) {
return "override";
}
Как правильно записать переопределение, предполагая, что у меня нет доступа к базовому определению?
Если это имеет значение, я использую g++13
С помощью C++20 включения вы можете добавить перегрузку с ограничением:
template<class T>
requires is_my_tag<T>::value
std::string fun(const T&) {
return "override";
}
Для предыдущей версии, не меняя оригинал, вы можете добавить лучшую перегрузку (которая в основном дублирует определение is_my_tag
)
std::string fun(const my_tag&) {
return "override";
}
template<class... Tags>
std::string fun(const std::tuple<my_tag, Tags...>&) {
return "override";
}
это не переопределение, это перегрузка