<T extends Car> void startEngine(T c) {}
C++ では、上記と同等のものは次のようになります。
template<typename T, typename Unused= typename std::enable_if<std::is_base_of<Car,T>::value>::type>
void startEngine(T c) {}
さて、構文は醜いですが、次のようにエイリアスを使用して少し良くすることができます:
//first define a (reusuable) alias
template<typename D, typename B>
using extends = typename std::enable_if<std::is_base_of<B,D>::value>::type;
//then your code would look like this
template<typename T, typename Unused=extends<T,Car> >
void startEngine(T c)
{
}
static_assert
または、他の回答で説明されているように、を使用できます。しかしstd::enable_if
、 とstatic_assert
は等価ではありません。Whilestatic_assert
は適切なエラー メッセージを生成する機会を提供し、std::enable_if
オーバーロードを解決するのに役立ちます。つまり、上記の関数はCar
が のベースである場合にのみ呼び出されT
、そうでない場合は他のオーバーロードが選択/考慮されます。ではstatic_assert
、それは不可能です。単純に失敗して停止します — オーバーロードをそれ以上探しません。
同じく、
//then your code would look like this
template<typename T, typename Unused=extends<T,Comparable<T>> >
void compareWith(T c)
{
}
この手法は次のように知られています。
それが役立つことを願っています。