Zdefiniuj meta funkcję o nazwie extends
(który jest tylko nazwa pokryta cukrem) jako:
template<typename D, typename B>
using extends = std::is_base_of<B,D>;
Następnie zdefiniować swoją klasę jako:
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;
};
Lub można napisać to zamiast :
//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;
};
Ale w tym przypadku nie masz możliwości wygenerowania własnego erro r wiadomość. Kompilator może rzucić na ciebie dowolny komunikat o błędzie, który może być trudny do zrozumienia.
W każdym razie prawdopodobnie zdajesz sobie sprawę, że możesz bezpośrednio użyć std::is_base_of<>
. Ale jeśli szukasz pokrytej cukrem nazwy nazwa, wtedy extends
brzmi dobrze!
@LuchianGrigore: podobny, ale ten dotyczy funkcji, a dotyczy klas. Rozwiązania mogą się nieznacznie różnić (np. Opcja enable_if jest tam najlepszą odpowiedzią, ale nie ma tu większego sensu). –