Definire una meta-funzione chiamata extends
(che è solo un nome rivestite di zucchero) come:
template<typename D, typename B>
using extends = std::is_base_of<B,D>;
Quindi definire la classe come:
template <class B>
class C
{
//here you can check it, and generate your own error message!
static_assert(extends<B,A>(),
"Constraint Violation: B doesn't derive from A.");
B instance;
};
alternativa, è possibile scrivere questo posto :
//define it a bit differently now!
template<typename D, typename B>
using extends = typename std::enable_if<std::is_base_of<B,D>::value>::type;
template <class B, class Unused=extends<B,A>>
class C
{
B instance;
};
Ma in questo caso, non si dispone di opportunità di generare il proprio erro messaggio. Il compilatore è libero di inviare a qualsiasi messaggio di errore che potrebbe essere difficile da comprendere.
In ogni caso, probabilmente ti rendi conto che puoi utilizzare direttamente std::is_base_of<>
. Ma se stai cercando il nome ricoperto di zucchero, allora extends
suona bene!
@LuchianGrigore: simile, ma quello riguarda le funzioni e questo riguarda le classi. Le soluzioni possono essere leggermente diverse (ad es. Enable_if è la risposta migliore, ma qui non ha molto senso). –