#include <iostream>
using namespace std;
#include <boost/utility/enable_if.hpp>
#include <boost/type_traits/is_same.hpp>
typedef unsigned int UINT;
//Foo.h
template <typename T>
struct returnThis {};
class Foo
{
public:
template <typename T>
typename boost::enable_if<boost::is_same<T,float>,returnThis<float>*>::type
bar();
template <typename T>
typename boost::enable_if_c<boost::is_same<T,UINT>::value and boost::is_same<UINT,unsigned int>::value,
returnThis<UINT>*>::type
bar();
template <typename T>
typename boost::enable_if_c<boost::is_same<T,UINT>::value and not boost::is_same<UINT,unsigned int>::value,
returnThis<UINT>*>::type
bar();
};
int main() {
Foo f;
f.bar<float>();
f.bar<UINT>();
return 0;
}
// cppfile
template <typename T>
typename boost::enable_if<boost::is_same<T,float>,returnThis<float>*>::type
Foo::bar()
{
cout << "bar<T==float>()\n";
return 0;
}
template <typename T>
typename boost::enable_if_c<boost::is_same<T,UINT>::value and boost::is_same<UINT,unsigned int>::value,
returnThis<UINT>*>::type
Foo::bar()
{
cout << "bar<T==UINT and UINT==usigned int>()\n";
return 0;
}
template <typename T>
typename boost::enable_if_c<boost::is_same<T,UINT>::value and not boost::is_same<UINT,unsigned int>::value,
returnThis<UINT>*>::type
Foo::bar()
{
cout << "bar<T==UINT and UINT!=usigned int>()\n";
return 0;
}
template returnThis<float>* Foo::bar<float>();
template returnThis<UINT>* Foo::bar<UINT>();
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2luY2x1ZGUgPGJvb3N0L3V0aWxpdHkvZW5hYmxlX2lmLmhwcD4KICNpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9pc19zYW1lLmhwcD4KCnR5cGVkZWYgdW5zaWduZWQgaW50IFVJTlQ7CgovL0Zvby5oCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgcmV0dXJuVGhpcyB7fTsKCmNsYXNzIEZvbwp7CnB1YmxpYzoKCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgIHR5cGVuYW1lIGJvb3N0OjplbmFibGVfaWY8Ym9vc3Q6OmlzX3NhbWU8VCxmbG9hdD4scmV0dXJuVGhpczxmbG9hdD4qPjo6dHlwZSAKICAgIGJhcigpOwoKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgdHlwZW5hbWUgYm9vc3Q6OmVuYWJsZV9pZl9jPGJvb3N0Ojppc19zYW1lPFQsVUlOVD46OnZhbHVlIGFuZCBib29zdDo6aXNfc2FtZTxVSU5ULHVuc2lnbmVkIGludD46OnZhbHVlLAogICAgcmV0dXJuVGhpczxVSU5UPio+Ojp0eXBlIAogICAgYmFyKCk7CgogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICB0eXBlbmFtZSBib29zdDo6ZW5hYmxlX2lmX2M8Ym9vc3Q6OmlzX3NhbWU8VCxVSU5UPjo6dmFsdWUgYW5kIG5vdCBib29zdDo6aXNfc2FtZTxVSU5ULHVuc2lnbmVkIGludD46OnZhbHVlLAogICAgICAgICAgICAgcmV0dXJuVGhpczxVSU5UPio+Ojp0eXBlIAogICAgYmFyKCk7Cn07CgoKaW50IG1haW4oKSB7CglGb28gZjsKCWYuYmFyPGZsb2F0PigpOwoJZi5iYXI8VUlOVD4oKTsKCXJldHVybiAwOwp9CgoKLy8gY3BwZmlsZQogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICB0eXBlbmFtZSBib29zdDo6ZW5hYmxlX2lmPGJvb3N0Ojppc19zYW1lPFQsZmxvYXQ+LHJldHVyblRoaXM8ZmxvYXQ+Kj46OnR5cGUgCiAgICBGb286OmJhcigpCiAgICB7CiAgICAgICAJY291dCA8PCAiYmFyPFQ9PWZsb2F0PigpXG4iOwogICAgICAgCXJldHVybiAwOwogICAgfQoKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgdHlwZW5hbWUgYm9vc3Q6OmVuYWJsZV9pZl9jPGJvb3N0Ojppc19zYW1lPFQsVUlOVD46OnZhbHVlIGFuZCBib29zdDo6aXNfc2FtZTxVSU5ULHVuc2lnbmVkIGludD46OnZhbHVlLAogICAgcmV0dXJuVGhpczxVSU5UPio+Ojp0eXBlIAogICAgRm9vOjpiYXIoKQogICAgewogICAgICAJY291dCA8PCAiYmFyPFQ9PVVJTlQgYW5kIFVJTlQ9PXVzaWduZWQgaW50PigpXG4iOwogICAgICAgCXJldHVybiAwOwogICAgfQoKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgdHlwZW5hbWUgYm9vc3Q6OmVuYWJsZV9pZl9jPGJvb3N0Ojppc19zYW1lPFQsVUlOVD46OnZhbHVlIGFuZCBub3QgYm9vc3Q6OmlzX3NhbWU8VUlOVCx1bnNpZ25lZCBpbnQ+Ojp2YWx1ZSwKICAgIHJldHVyblRoaXM8VUlOVD4qPjo6dHlwZSAKICAgIEZvbzo6YmFyKCkKICAgIHsKICAgICAgIAljb3V0IDw8ICJiYXI8VD09VUlOVCBhbmQgVUlOVCE9dXNpZ25lZCBpbnQ+KClcbiI7CiAgICAgICAJcmV0dXJuIDA7CiAgICB9CgoKCXRlbXBsYXRlIHJldHVyblRoaXM8ZmxvYXQ+KiBGb286OmJhcjxmbG9hdD4oKTsKCXRlbXBsYXRlIHJldHVyblRoaXM8VUlOVD4qIEZvbzo6YmFyPFVJTlQ+KCk7