Problème
Je voudrais détecter si une classe a des variables membres et échouer un static assert si c'est le cas. Quelque chose comme :
struct b {
int a;
}
static_assert(!has_member_variables, "La classe ne doit pas contenir de membres"). // Erreur.
struct c {
virtual void a() {}
void other() {}
}
static_assert(!has_member_variables, "La classe ne doit pas contenir de membres"). // Bien.
struct d : c {
}
static_assert(!has_member_variables, "La classe ne doit pas contenir de membres"). // Bien.
struct e : b {
}
static_assert(!has_member_variables, "La classe ne doit pas contenir de membres"). // Erreur.
struct f : c {
char z;
}
static_assert(!has_member_variables, "La classe ne doit pas contenir de membres"). // Erreur.
**
Est-il possible d'atteindre cet objectif avec un modèle SFINAE ? Cette classe peut avoir de l'héritage voire même de l'héritage multiple avec des fonctions virtuelles (sans membres dans les classes de base cependant).
Motivation
J'ai une configuration assez simple comme suit :
class iFuncRtn {
virtual Status runFunc(Data &data) = 0;
};
template
class FuncRoutineDataHelper : public iFuncRtn {
Status runFunc(Data &data) {
static_assert(!has_member_variables, "Les routines ne doivent pas avoir de membres de données !");
// Préparer des données spéciales pour la routine
TSpecialDataType sData(data);
runFuncImpl(sData);
}
class SpecificRtn :
public FuncRoutineDataHelper {
virtual Status runFuncImpl(MySpecialData &sData) {
// Calcul basé sur l'entrée
sData.setValue(someCalculation);
}
};
Les Routines de fonctionnalité
sont gérées et exécutées à chaque tick. Elles sont personnalisées et peuvent effectuer une grande variété de tâches comme contacter d'autres appareils, etc. Les données qui sont passées peuvent être manipulées par la routine et sont garanties d'être passées à chaque exécution de tick jusqu'à ce que la fonctionnalité soit terminée. Le bon type de données est passé en fonction du DataHelper
class. Je veux dissuader les futures personnes de rajouter accidentellement des données aux routines de fonctionnalité car il est très peu probable que cela fasse ce qu'ils attendent. Pour forcer cela, j'espérais trouver un moyen avec un static assert.
**