Si tratta di un frammento di codice che ho intenzione di utilizzare al fine di verificare se i tipi di modello variadic sono uniche:Come posso rendere più breve questo codice di template variadic utilizzando le funzionalità di C++ 14 e C++ 1z?
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, "!");
}
C'è un modo per rendere il codice più corti e/o più concise funzioni utilizzando introdotte nel C++ 14 e C++ 1z? O c'è un modo migliore per ottenere lo stesso effetto usando le nuove funzionalità?
Nel caso di C++ 1z, intendo: funzionalità che sono già disponibili nelle versioni più recenti di Clang e GCC.
No, è abbastanza conciso così com'è. Quando vengono introdotte le espressioni di piegatura, tuttavia, puoi fare qualcosa del tipo: 'constexpr statico valore bool = std :: is_same :: valore || ... ' –
@BrianRodriguez: Penso che abbia bisogno di parentesi tonde. –
Puoi usare un po 'di trucchetti per rendere 'is_one_of' un po' più conciso: http://coliru.stacked-crooked.com/a/3b9755f28193a13b – melak47