私はうまくいった次のコードを持っていました:
template<typename T>
class Base {
virtual void call(T) = 0;
};
class Derived : public Base<int> {
void call(int);
}
template<typename T>
void registerBase(const Base<T>& ref) {}
このアプローチは、 as が呼び出されたときに as 型を自動検出T
できint
ますregisterBase(Derived())
。問題は、次のように切り替えると発生しshared_ptr
ます。
template<typename T, typename Q>
void registerBase(shared_ptr<Q> ptr) {
static_assert(is_base_of<Base<T>, Q>::value, "Have to supply a type extending Base<...>");
}
不正な型から保護できますが、型を自動検出できないようですT
。Base<T>
テンプレート推論が機能するように、shared_ptr を自動的にダウンキャストするために使用できるトリックはありますか? または、 typename を見つける別の方法はありT
ますか?
PS:Q
拡張が乗算された場合Base<T>
、エラーが発生します (自動推定は失敗するはずです)。