2017-05-22 2 views
0

J'ai une fonction constexpr qui regroupe plusieurs static_asserts pour les contrats de conception. Je voudrais l'appeler au moment de la compilation, sans avoir à créer une variable constexpr non utilisée.Déclenchez void constexpr au moment de la compilation?

Voici un exemple de ce que j'ai actuellement à faire (C++ 17).

template<size_t N = 0, typename... Ts, typename F> 
inline constexpr int tuple_for(const std::tuple<Ts...>& t, const F& func) { 
    func(std::get<N>(t)); 

    if constexpr(N < sizeof...(Ts) - 1) { 
     return tuple_for<N + 1, Ts...>(t, func); 
    } else { 
     return 0; 
    } 
} 

auto do_checks = [](const auto& t) { 
    static_assert(has_some_method_v<decltype(t)>, 
      "You need some_method"); 
    return 0; 
} 

[[maybe_unused]] 
constexpr int i_am_sad = tuple_for(my_tuple, do_checks); 

Existe-t-il un autre moyen d'obtenir ce comportement? Peut-être quelque chose de nouveau en C++ 17?

Merci.

edit: Notez que comme ces vérifications doivent être généralisées, je crois qu'avoir les asserts dans une fonction est la bonne façon d'y aller.

+0

Vous n'avez pas vraiment besoin d'une fonction wrapper, mettez simplement static_assert' tel quel. – VTT

+0

Je devrais modifier l'exemple, cela fonctionne sur un tuple d'objet. Donc, dans la base de code réelle, il doit être. – scx

+0

pourquoi avez-vous besoin de revenir? il suffit d'appeler cette fonction sans valeur de retour. – Kobi

Répondre

2

Vous pourriez l'utiliser dans d'autres contexte constexpr comme static_assert:

static_assert((static_cast<void>(tuple_for(my_tuple, do_checks)), true), "!"); 

[Note]: le casting à void est de généraliser, si vous voulez retourner la classe avec une virgule surchargée de mal.

+0

Merci, mais pas visuellement agréable, c'est préfet. Quelle est la surcharge des virgules? Ça semble intéressant. – scx

+0

[Démo] (https://ideone.com/4vlfms) de virgule de l'opérateur mal surchargé. – Jarod42

+0

Oh mon dieu! C'est tellement diabolique ... J'adore ça: D Fait une petite aide de macro, a l'air plutôt propre. – scx

0

static_assert est une déclaration-déclaration , donc vous pouvez simplement la placer dans l'espace libre.

Pas besoin de fonction.

C'est précisément le cas d'utilisation pour cela. :)

+0

L'exemple est mauvais, je vais l'éditer pour ressembler plus à ce que je fais. 5mins :) – scx