#include <iostream>
#include <string>
void foo(int i) { std::cout << "foo " << i << std::endl; }
void bar(int i) { std::cout << "bar " << i << std::endl; }
void foobar(int f) { std::cout << "foobar " << f << std::endl; }
template <typename T> struct DefaultF;
template <>
struct DefaultF<int>
{
static constexpr void (*F)(int) = &foo;
};
template <>
struct DefaultF<float>
{
static constexpr void (*F)(int) = &foobar;
};
template<class T, void (*F)(int) = DefaultF<T>::F>
void MyF(const std::string&, const T& t) {
F(t);
}
int main() {
MyF<int>("test", 42);
MyF<int, &bar>("test", 42);
MyF<float>("test", 42.f);
// MyF<char>("test", '*'); // Won't compile, no DefaultF<char>::F
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdm9pZCBmb28oaW50IGkpIHsgc3RkOjpjb3V0IDw8ICJmb28gIiA8PCBpIDw8IHN0ZDo6ZW5kbDsgfQp2b2lkIGJhcihpbnQgaSkgeyBzdGQ6OmNvdXQgPDwgImJhciAiIDw8IGkgPDwgc3RkOjplbmRsOyB9CnZvaWQgZm9vYmFyKGludCBmKSB7IHN0ZDo6Y291dCA8PCAiZm9vYmFyICIgPDwgZiA8PCBzdGQ6OmVuZGw7IH0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgRGVmYXVsdEY7Cgp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgRGVmYXVsdEY8aW50Pgp7CiAgICBzdGF0aWMgY29uc3RleHByIHZvaWQgKCpGKShpbnQpID0gJmZvbzsKfTsKCnRlbXBsYXRlIDw+CnN0cnVjdCBEZWZhdWx0RjxmbG9hdD4KewogICAgc3RhdGljIGNvbnN0ZXhwciB2b2lkICgqRikoaW50KSA9ICZmb29iYXI7Cn07Cgp0ZW1wbGF0ZTxjbGFzcyBULCB2b2lkICgqRikoaW50KSA9IERlZmF1bHRGPFQ+OjpGPgp2b2lkIE15Rihjb25zdCBzdGQ6OnN0cmluZyYsIGNvbnN0IFQmIHQpIHsKICAgIEYodCk7Cn0KCmludCBtYWluKCkgewogICAgTXlGPGludD4oInRlc3QiLCA0Mik7CiAgICBNeUY8aW50LCAmYmFyPigidGVzdCIsIDQyKTsKICAgIE15RjxmbG9hdD4oInRlc3QiLCA0Mi5mKTsKICAgIC8vIE15RjxjaGFyPigidGVzdCIsICcqJyk7IC8vIFdvbid0IGNvbXBpbGUsIG5vIERlZmF1bHRGPGNoYXI+OjpGCn0K