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 E>
struct GetFloatType<E, typename enable_if_type<typename E::Inner>::type>
{
typedef typename E::Inner type;
};
#include <typeinfo>
#include <iostream>
template <class Elemtype, class Floattype = typename GetFloatType<Elemtype>::type>
class ExponentialSmoother
{
public:
void print()
{
std::cout << "Elem: " << typeid(Elemtype).name()
<< ", Float: " << typeid(Floattype).name() << "\n";
}
};
template<typename T>
class Vector
{
public:
typedef T Scalar;
};
template<typename T>
class Vector2
{
public:
typedef T Inner;
};
class Vec : public Vector<double>, public Vector2<float>
{
};
int main()
{
ExponentialSmoother<Vector<float> >().print();
ExponentialSmoother<Vector2<float> >().print();
ExponentialSmoother<double>().print();
ExponentialSmoother<double,char>().print();
// The following is ambiguous: Vec::Inner or Vec::Scalar ?
//ExponentialSmoother<Vec>().print();
}
ICAgIHRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFIgPSB2b2lkPiAgCiAgICBzdHJ1Y3QgZW5hYmxlX2lmX3R5cGUKICAgIHsKICAgICAgICB0eXBlZGVmIFIgdHlwZTsKICAgIH07CiAKICAgIHRlbXBsYXRlPGNsYXNzIEUsIGNsYXNzIEVuYWJsZSA9IHZvaWQ+CiAgICBzdHJ1Y3QgR2V0RmxvYXRUeXBlCiAgICB7CiAgICAgICAgdHlwZWRlZiBFIHR5cGU7CiAgICB9OwogCiAgICB0ZW1wbGF0ZTxjbGFzcyBFPgogICAgc3RydWN0IEdldEZsb2F0VHlwZTxFLCB0eXBlbmFtZSBlbmFibGVfaWZfdHlwZTx0eXBlbmFtZSBFOjpTY2FsYXI+Ojp0eXBlPgogICAgewogICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgRTo6U2NhbGFyIHR5cGU7CiAgICB9OwogICAgCiAgICB0ZW1wbGF0ZTxjbGFzcyBFPgogICAgc3RydWN0IEdldEZsb2F0VHlwZTxFLCB0eXBlbmFtZSBlbmFibGVfaWZfdHlwZTx0eXBlbmFtZSBFOjpJbm5lcj46OnR5cGU+CiAgICB7CiAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBFOjpJbm5lciB0eXBlOwogICAgfTsKIAogI2luY2x1ZGUgPHR5cGVpbmZvPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogICAgdGVtcGxhdGUgPGNsYXNzIEVsZW10eXBlLCBjbGFzcyBGbG9hdHR5cGUgPSB0eXBlbmFtZSBHZXRGbG9hdFR5cGU8RWxlbXR5cGU+Ojp0eXBlPgogICAgY2xhc3MgRXhwb25lbnRpYWxTbW9vdGhlcgogICAgewogICAgICAgIHB1YmxpYzoKICAgICAgICB2b2lkIHByaW50KCkKICAgICAgICB7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiRWxlbTogIiA8PCB0eXBlaWQoRWxlbXR5cGUpLm5hbWUoKQogICAgICAgICAgICAgICAgPDwgIiwgRmxvYXQ6ICIgPDwgdHlwZWlkKEZsb2F0dHlwZSkubmFtZSgpIDw8ICJcbiI7CiAgICAgICAgfQogICAgfTsKIAogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIGNsYXNzIFZlY3RvcgogICAgewogICAgICAgIHB1YmxpYzoKICAgICAgICB0eXBlZGVmIFQgU2NhbGFyOwogICAgfTsKIAogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIGNsYXNzIFZlY3RvcjIKICAgIHsKICAgICAgICBwdWJsaWM6CiAgICAgICAgdHlwZWRlZiBUIElubmVyOwogICAgfTsKICAgIAogICAgY2xhc3MgVmVjIDogcHVibGljIFZlY3Rvcjxkb3VibGU+LCBwdWJsaWMgVmVjdG9yMjxmbG9hdD4KICAgIHsKICAgIAogICAgfTsKIAppbnQgbWFpbigpCnsKICAgIEV4cG9uZW50aWFsU21vb3RoZXI8VmVjdG9yPGZsb2F0PiA+KCkucHJpbnQoKTsKICAgIEV4cG9uZW50aWFsU21vb3RoZXI8VmVjdG9yMjxmbG9hdD4gPigpLnByaW50KCk7CiAgICBFeHBvbmVudGlhbFNtb290aGVyPGRvdWJsZT4oKS5wcmludCgpOwogICAgRXhwb25lbnRpYWxTbW9vdGhlcjxkb3VibGUsY2hhcj4oKS5wcmludCgpOwogICAgLy8gVGhlIGZvbGxvd2luZyBpcyBhbWJpZ3VvdXM6IFZlYzo6SW5uZXIgb3IgVmVjOjpTY2FsYXIgPwogICAgLy9FeHBvbmVudGlhbFNtb290aGVyPFZlYz4oKS5wcmludCgpOwp9