guanaqo 1.0.0-alpha.26
Utilities for scientific software
Loading...
Searching...
No Matches
possible-alias.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file
4/// @ingroup core
5/// Utility to guard against accidental template aliases.
6
7#include <type_traits>
8
9namespace guanaqo {
10namespace detail {
11
12/// Check if @p A is equal to any of @p Bs.
13template <class A, class... Bs>
14constexpr bool any_is_same() {
15 return (std::is_same_v<A, Bs> || ...);
16}
17
18/// Unused unique type tag for template specializations that were rejected
19/// because some types were not distinct.
20template <class...>
21struct dummy;
22
23} // namespace detail
24
25/// If @p NewAlias is not the same type as any of @p PossibleAliases, the result
26/// is @p NewAlias. If @p NewAlias is not distinct from @p PossibleAliases, the
27/// result is a dummy type, uniquely determined by @p NewAlias and
28/// @p PossibleAliases.
29/// @ingroup core
30template <class NewAlias, class... PossibleAliases>
32 std::conditional_t<detail::any_is_same<NewAlias, PossibleAliases...>(),
34
35} // namespace guanaqo
std::conditional_t< detail::any_is_same< NewAlias, PossibleAliases... >(), detail::dummy< NewAlias, PossibleAliases... >, NewAlias > possible_alias_t
If NewAlias is not the same type as any of PossibleAliases, the result is NewAlias.
constexpr bool any_is_same()
Check if A is equal to any of Bs.
Unused unique type tag for template specializations that were rejected because some types were not di...