#include <iostream>
#include <concepts>
struct Sound { int amplitude; };
struct Light { int brightness; };
template <typename T>
concept Alert = std::derived_from<T, Sound> && std::derived_from<T, Light>;
struct FirstSound : Sound{};
struct FirstLight : Light{};
struct FirstSoundLight : FirstSound, FirstLight{};
struct LastSound : Sound{};
struct LastLight : Light{};
struct LastSoundLight : LastSound, LastLight{};
template <typename T>
concept FirstAlert = std::derived_from<T, FirstSound> && std::derived_from<T, FirstLight>;
template <typename T>
concept LastAlert = std::derived_from<T, LastSound> && std::derived_from<T, LastLight>;
void warn(FirstAlert auto const& a, LastAlert auto const& b)
{ std::cout << "Special warning"; }
void warn(Alert auto const& a, LastAlert auto const& b) = delete;
//{ std::cout << "Deleted warning"; }
void warn(Alert auto const& a, Alert auto const& b)
{ std::cout << "General warning"; }
int main()
{
warn(FirstSoundLight{}, LastSoundLight{});
return 0;
}
上面的代码是我问题的简化版本。如何使编译器在不明确施放参数的情况下以给定的顺序进行无歧义的函数?
您需要包含在其他两个概念中:
concept Alert