
項目 27:ユニヴァーサル参照をとるオーバロードの代替策を把握する
|
197
は Person から派生した型以外のすべての型の場合に有効にしたいのです。なんて厄介な継承で
しょう!
ある型が他の型から派生しているか否かを判定する機能が標準の型特性にあると知っても驚
くことはありません。std::is_base_of がそれです。T2 が T1 から派生している場合、std::
is_base_of<T1, T2>::value が真となります。型は自分自身から派生しているとみなされるため、
std::is_base_of<T, T>::value も真となります。これは便利な機能です。ここでしたいことは、
先の条件を改善し、(参照と cv 修飾子を除去後の)型 T が Person でも Person から派生したクラ
スでもない場合にのみ、Person の完全転送コンストラクタを有効にしたいのですからまさにうって
つけです。次のように、std::is_same を std::is_base_of に変更すれば良いのです8。
class Person {
public:
template<
typename T,
typename = typename std::enable_if<
!std::is_base_of<Person,
typename std::decay<T>::type
>::value
>::type
>
explicit Person(T&& n);
…
};
これでやっと完了しました。提示した