ist ein Code-Snippet, das werde ich nutzen, um zu prüfen, ob die variadische Template-Typen sind einzigartig:Wie kann ich diesen variadischen Template-Code mit Features aus C++ 14 und C++ 1z verkürzen? Dieser
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, "!");
}
Gibt es eine Möglichkeit, dies Code kürzer zu machen und/oder prägnanter mit Funktionen eingeführt in C++ 14 und C++ 1z? Oder gibt es einen besseren Weg, um mit den neuen Funktionen den gleichen Effekt zu erzielen?
Im Fall von C++ 1z meine ich: Funktionen, die bereits in den neuesten Versionen von Clang und GCC verfügbar sind.
Nein, das ist ziemlich prägnant wie es ist. Wenn jedoch Faltungsausdrücke eingeführt werden, können Sie Folgendes tun: 'constexpr statisch bool value = std :: is_same :: value || ... ' –
@BrianRodriguez: Das braucht runde Klammern, denke ich. –
Sie können ein wenig Tricks verwenden, um das 'is_one_of' ein wenig prägnanter zu machen: http://coliru.stacked-crooked.com/a/3b9755f28193a13b – melak47