Задать вопрос
Dyikot
@Dyikot

Возможно ли перегрузить с помощью ограничений?

У меня есть следующий пример который хотелось бы перегрузить:
template<typename T>
constexpr auto FirstOrDefault(const T& defaultValue)
{
	return _FirstOrDefaultAdaptor2<T>(defaultValue);
}

template<typename TPredicate>
constexpr auto FirstOrDefault(TPredicate predicate)
{
	return _FisrtOrDefaultAdaptor3<TPredicate>(std::move(predicate));
}
  • Вопрос задан
  • 85 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Mercury13
Программист на «си с крестами» и не только
Через концепции работает отлично. Через enable_if не вижу способа. Через if constexpr вот так.
#include <iostream>
#include <concepts>

class A {};
class AA : public A {
public:
    static constexpr const char* AData = "AA";
};

class B {};
class BB : public B {
public:
    static constexpr const char* BData = "BB";
};

// Через концепции
template <class T>
concept ASon = std::derived_from<T, A>;

template <class T>
concept BSon = std::derived_from<T, B>;

template <ASon T>
void foo(const T&) {
    std::cout << T::AData << std::endl;
}

template <BSon T>
void foo(const T&) {
    std::cout << T::BData << std::endl;
}

template <class T> constexpr bool FALSE_V = false;

// Через if consexpr
template <class T>
void bar(const T&) {
    if constexpr (std::is_base_of_v<A, T>) {
        std::cout << T::AData << std::endl;
    } else if constexpr (std::is_base_of_v<B, T>) {
        std::cout << T::BData << std::endl;
    } else {
        static_assert(FALSE_V<T>);
    }
}

int main()
{
    foo(AA());
    foo(BB());
    bar(AA());
    bar(BB());
    return 0;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы