Comme ces classes ont aucune relation, je vois maintenant façon de le faire parce que vous devez être explicite sur les types de sorcières que vous voulez vérifier.
La seule manière DRY d'appliquer ceci est ce que Nikolai N Festissov a proposé. J'écrivais un exemple similaire avec quelques modifications mineures, mais l'idée globale est de faire une classe boost :: nocopy-like qui va forcer la classe enfant à avoir une taille donnée.
template< typename CheckedType, size_t FixedSize >
class SizeChecked // simple, no inheritance overload
{
public:
SizeChecked()
{
// c++0x or compilers with static_assert() available
//static_assert(sizeof(CheckedType) == FixedSize, "Type size check failed!");
BOOST_STATIC_ASSERT(sizeof(CheckedType) == FixedSize);
}
};
template< typename CheckedType >
class Size512 : public SizeChecked< CheckedType, 512 > // simple, no inheritance overload
{};
////////////////////////////////////////////////////////////////////
class A : Size512<A> // automatically check
{
};
class B : Size512<B> // automatically check
{
std::array< char, 512 > m_array;
};
class C : SizeChecked< C, 1 >
{
char m_char;
};
class D : SizeChecked< D, 4 >
{
short m_k;
char m_u;
};
int wmain()
{
// need instantiation to be checked !
//A a; // will trigger the assertion at compile time
B b; // sizeof(B) == 512 : will be fine
C c; // sizeof(C) == 1 : will be fine
//D d; // will fail because sizeof(short) + sizeof(char) != 4 !
}
Attention: si vous avez l'héritage libre vous reste à fournir un contrôle explicite sur les classes d'enfants, le chèque est pas hérité! A propos, une manière possible d'être plus DRY serait de mettre toutes vos affirmations statiques en un seul endroit.
Pourquoi avez-vous besoin d'affirmer que toutes les tailles seront 512 (ou un autre nombre magique)? Je demande parce que cela vous dit habituellement si vous devez vous répéter et où un tel test devrait aller si vous ne voulez pas vous répéter. Par exemple, si 512 est la taille d'une ligne de cache, vous devez associer A, B et C avec un concept de "correspond exactement à une ligne de cache" et l'exprimer quelque part. – MSN
La raison en est que toutes ces classes sont liées, bien que l'un des points communs est que leur taille doit être exactement de 512 octets. Alors pourquoi les différentes classes? C'est parce que A, B et C expriment différents types de messages. – sivabudh