#include <iostream>
using E = int;
using r = int;
template<typename TYPE>
class Target5
{
public:
Target5(const TYPE &value) : value(value) {}
TYPE value;
template <typename T>
void OneParam(T a)
{
std::cout << "Target5::OneParam(" << value << "," << a << ")\n";
typedef void (Target5<E>::*MethodTypeToCall)(T);
// Here, the compiler picks the right overload
MethodTypeToCall toCall = &Target5<E>::Private<T>;
// In this case, the compiler does not let us write the following line (parse error):
//MethodTypeToCall toCall = &Target5<E>::Private<t;;
(this->*toCall)(a);
}
template <typename T1, typename T2>
void TwoParam(T1 a, T2 b)
{
std::cout << "Target5::TwoParam(" << value << "," << a << "," << b << ")\n";
typedef void (Target5<E>::*MethodTypeToCall)(T1, T2);
MethodTypeToCall toCall = &Target5<E>::Private<T1, T2>; // compiler picks the right overload
// you can't add the method's template parameters to the end of that line
(this->*toCall)(a, b);
}
private:
template <typename T>
void Private(T a)
{
std::cout << "Target5::Private(" << value << "," << a << ")\n";
}
template <typename T1, typename T2>
void Private(T1 a, T2 b)
{
std::cout << "Target5::Private(" << value << "," << a << "," << b << ")\n";
}
};
inline
void HoldingAPointerToTemplateMemberInTemplateClass()
{
Target5<r> target('c');
void (Target5<r>::*oneParam)(int) = &Target5<r>::OneParam;
(target.*oneParam)(7);
void (Target5<r>::*twoParam)(float, int) = &Target5<r>::TwoParam;
(target.*twoParam)(7.5, 7);
}
int main()
{
HoldingAPointerToTemplateMemberInTemplateClass();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgRSA9IGludDsKdXNpbmcgciA9IGludDsKCnRlbXBsYXRlPHR5cGVuYW1lIFRZUEU+CmNsYXNzIFRhcmdldDUKewpwdWJsaWM6CglUYXJnZXQ1KGNvbnN0IFRZUEUgJnZhbHVlKSA6IHZhbHVlKHZhbHVlKSB7fQoJVFlQRSB2YWx1ZTsKCgl0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KCXZvaWQgT25lUGFyYW0oVCBhKQoJewoJCXN0ZDo6Y291dCA8PCAiVGFyZ2V0NTo6T25lUGFyYW0oIiA8PCB2YWx1ZSA8PCAiLCIgPDwgYSA8PCAiKVxuIjsKCgkJdHlwZWRlZiB2b2lkIChUYXJnZXQ1PEU+OjoqTWV0aG9kVHlwZVRvQ2FsbCkoVCk7CgkJLy8gSGVyZSwgdGhlIGNvbXBpbGVyIHBpY2tzIHRoZSByaWdodCBvdmVybG9hZAoJCU1ldGhvZFR5cGVUb0NhbGwgdG9DYWxsID0gJlRhcmdldDU8RT46OlByaXZhdGU8VD47CgkJLy8gSW4gdGhpcyBjYXNlLCB0aGUgY29tcGlsZXIgZG9lcyBub3QgbGV0IHVzIHdyaXRlIHRoZSBmb2xsb3dpbmcgbGluZSAocGFyc2UgZXJyb3IpOgoJCS8vTWV0aG9kVHlwZVRvQ2FsbCB0b0NhbGwgPSAmVGFyZ2V0NTxFPjo6UHJpdmF0ZTx0OzsKCQkodGhpcy0+KnRvQ2FsbCkoYSk7Cgl9CgoJdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KCXZvaWQgVHdvUGFyYW0oVDEgYSwgVDIgYikKCXsKCQlzdGQ6OmNvdXQgPDwgIlRhcmdldDU6OlR3b1BhcmFtKCIgPDwgdmFsdWUgPDwgIiwiIDw8IGEgPDwgIiwiIDw8IGIgPDwgIilcbiI7CgoJCXR5cGVkZWYgdm9pZCAoVGFyZ2V0NTxFPjo6Kk1ldGhvZFR5cGVUb0NhbGwpKFQxLCBUMik7CgkJTWV0aG9kVHlwZVRvQ2FsbCB0b0NhbGwgPSAmVGFyZ2V0NTxFPjo6UHJpdmF0ZTxUMSwgVDI+OyAvLyBjb21waWxlciBwaWNrcyB0aGUgcmlnaHQgb3ZlcmxvYWQKCQkvLyB5b3UgY2FuJ3QgYWRkIHRoZSBtZXRob2QncyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHRvIHRoZSBlbmQgb2YgdGhhdCBsaW5lCgkJKHRoaXMtPip0b0NhbGwpKGEsIGIpOwoJfQoKcHJpdmF0ZToKCgl0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KCXZvaWQgUHJpdmF0ZShUIGEpCgl7CgkJc3RkOjpjb3V0IDw8ICJUYXJnZXQ1OjpQcml2YXRlKCIgPDwgdmFsdWUgPDwgIiwiIDw8IGEgPDwgIilcbiI7Cgl9Cgl0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgoJdm9pZCBQcml2YXRlKFQxIGEsIFQyIGIpCgl7CgkJc3RkOjpjb3V0IDw8ICJUYXJnZXQ1OjpQcml2YXRlKCIgPDwgdmFsdWUgPDwgIiwiIDw8IGEgPDwgIiwiIDw8IGIgPDwgIilcbiI7Cgl9Cn07CgppbmxpbmUKdm9pZCBIb2xkaW5nQVBvaW50ZXJUb1RlbXBsYXRlTWVtYmVySW5UZW1wbGF0ZUNsYXNzKCkKewoJVGFyZ2V0NTxyPiB0YXJnZXQoJ2MnKTsKCgl2b2lkIChUYXJnZXQ1PHI+Ojoqb25lUGFyYW0pKGludCkgPSAmVGFyZ2V0NTxyPjo6T25lUGFyYW07CgkodGFyZ2V0LipvbmVQYXJhbSkoNyk7Cgl2b2lkIChUYXJnZXQ1PHI+OjoqdHdvUGFyYW0pKGZsb2F0LCBpbnQpID0gJlRhcmdldDU8cj46OlR3b1BhcmFtOwoJKHRhcmdldC4qdHdvUGFyYW0pKDcuNSwgNyk7Cn0KCmludCBtYWluKCkKewoJSG9sZGluZ0FQb2ludGVyVG9UZW1wbGF0ZU1lbWJlckluVGVtcGxhdGVDbGFzcygpOwp9