template<class T, class R = void>
struct enable_if_type
{
typedef R type;
};
template<class E, class Enable = void>
struct GetFloatType
{
typedef E type;
};
template<class E>
struct GetFloatType<E, typename enable_if_type<typename E::Scalar>::type>
{
typedef typename E::Scalar type;
};
template <class Elemtype, class Floattype = typename GetFloatType<Elemtype>::type>
class ExponentialSmoother
{
// ...
};
template<typename T>
class Vector
{
public:
typedef T Scalar;
};
template<typename T>
class Vector2
{
};
int main()
{
ExponentialSmoother<Vector<float> > a;
ExponentialSmoother<Vector2<float> > b;
ExponentialSmoother<double> c;
}
ICAgIHRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFIgPSB2b2lkPiAgCiAgICBzdHJ1Y3QgZW5hYmxlX2lmX3R5cGUKICAgIHsKICAgICAgICB0eXBlZGVmIFIgdHlwZTsKICAgIH07CgogICAgdGVtcGxhdGU8Y2xhc3MgRSwgY2xhc3MgRW5hYmxlID0gdm9pZD4KICAgIHN0cnVjdCBHZXRGbG9hdFR5cGUKICAgIHsKICAgICAgICB0eXBlZGVmIEUgdHlwZTsKICAgIH07CgogICAgdGVtcGxhdGU8Y2xhc3MgRT4KICAgIHN0cnVjdCBHZXRGbG9hdFR5cGU8RSwgdHlwZW5hbWUgZW5hYmxlX2lmX3R5cGU8dHlwZW5hbWUgRTo6U2NhbGFyPjo6dHlwZT4KICAgIHsKICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIEU6OlNjYWxhciB0eXBlOwogICAgfTsKCgogICAgdGVtcGxhdGUgPGNsYXNzIEVsZW10eXBlLCBjbGFzcyBGbG9hdHR5cGUgPSB0eXBlbmFtZSBHZXRGbG9hdFR5cGU8RWxlbXR5cGU+Ojp0eXBlPgogICAgY2xhc3MgRXhwb25lbnRpYWxTbW9vdGhlcgogICAgewogICAgICAgIC8vIC4uLgogICAgfTsKCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgY2xhc3MgVmVjdG9yCiAgICB7CiAgICAgICAgcHVibGljOgogICAgICAgIHR5cGVkZWYgVCBTY2FsYXI7CiAgICB9OwoKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICBjbGFzcyBWZWN0b3IyCiAgICB7CiAgICB9OwoKaW50IG1haW4oKQp7CiAgICBFeHBvbmVudGlhbFNtb290aGVyPFZlY3RvcjxmbG9hdD4gPiBhOwoJRXhwb25lbnRpYWxTbW9vdGhlcjxWZWN0b3IyPGZsb2F0PiA+IGI7CglFeHBvbmVudGlhbFNtb290aGVyPGRvdWJsZT4gYzsKfQ==