Это фрагмент кода, который я собираюсь использовать, чтобы проверить, уникальны ли типы вариационных шаблонов:
template <typename...>
struct is_one_of;
template <typename F>
struct is_one_of<F> {
static constexpr bool value = false;
};
template <typename F, typename S, typename... T>
struct is_one_of<F, S, T...> {
static constexpr bool value =
std::is_same<F, S>::value || is_one_of<F, T...>::value;
};
template <typename...>
struct is_unique;
template <>
struct is_unique<> {
static constexpr bool value = true;
};
template <typename F, typename... T>
struct is_unique<F, T...> {
static constexpr bool value =
is_unique<T...>::value && !is_one_of<F, T...>::value;
};
int main() {
constexpr bool b = is_unique<bool, int, double>::value;
constexpr bool c = is_unique<int, char, int>::value;
static_assert(b == true && c == false, "!");
}
Есть ли способ сделать этот код короче и/или более кратким с использованием функций, представленных на С++ 14 и С++ 1z? Или есть лучший способ добиться такого же эффекта, используя новые функции?
В случае С++ 1z я имею в виду: функции, которые уже доступны в новейших версиях Clang и GCC.