2017-04-20 2 views
0

Comment static_assert 3 éléments pour être identiques au moment de la compilation comme ceci.le moyen le plus propre de static_assert 3 éléments ou plus en ligne

union 
{ 
    std::uint32_t multibyte; 
    std::uint8_t bytes[4]; 
} test; 

static_assert(sizeof(test) == sizeof(test.multibyte) == sizeof(test.bytes), "Union size mismatch."); 

cours Alors la static_assert échoue ici parce que le dernier chèque sera 1 == 4. Y at-il beaucoup plus propre en plus

static_assert(sizeof(test.bytes) == sizeof(test.multibyte) && sizeof(test) == sizeof(test.bytes), "Union size mismatch."); 

Répondre

1

Si vous êtes en mesure d'utiliser puis par l'exemple suivant vous pouvez static_assert cas aussi, si elles peuvent être utilisées dans un constant expression:

template<typename T, typename... Ts> 
constexpr bool compare_sizes(T&&, Ts&&...) noexcept { 
    using expand = int[]; 
    bool result = sizeof...(Ts) > 0; 

    static_cast<void>(expand { 
     0, (static_cast<void>(result &= (sizeof(Ts) == sizeof(T))), 0)... 
    }); 
    return result; 
} 

Exemple d'utilisation avec votre union { /* ... */ } test:

static_assert(compare_sizes(test, test.multibyte, test.bytes), "Size mismatch."); 

Notez que la déclaration des variables et l'utilisation de static_cast déclaration sont interdites dans un corps de la fonction constexpr jusqu'à .

+0

Oui, cela va corriger l'exemple par un design différent. Ce que je cherche, s'il y a un temps de compilation std :: égal/memcmp solution semblable .. – ckain

+0

@ckain, a renouvelé ma réponse. – Akira

2

Vous pouvez écrire un struct pour cela:

template<typename...> struct AllSame; 

template<typename Arg1, typename Arg2, typename... Args> 
struct AllSame<Arg1, Arg2, Args...> 
{ 
    static constexpr bool value = sizeof(Arg1) == sizeof(Arg2) && AllSame<Arg1, Args...>::value; 
}; 

template<typename Arg> 
struct AllSame<Arg> 
{ 
     static constexpr bool value = true; 
}; 

Non testé, peut contenir des erreurs.

+0

Cela fonctionne, le 'AllSame :: value' me renvoie' true' et peut être utilisé dans une déclaration 'static_assert'. – Akira