#include <iostream>
#include <type_traits>
#include <functional>
#if 1
template <typename F>
auto myFunc(F f) -> decltype(!f('0'), std::function<bool(char)>(f), void()) {
std::cout << "std::function<bool(char)> overload" << std::endl;
}
#else
template <typename F>
void myFunc(F f, typename std::enable_if<std::is_constructible<
std::function<bool(char)>, F>::value>::type* = nullptr)
{
std::cout << "std::function<bool(char)> overload" << std::endl;
}
#endif
void myFunc(const std::string &seperator) {
std::cout << "std::string overload" << std::endl;
}
bool testCallback(char) {
return true;
}
int main()
{
myFunc("String literal");
myFunc(std::string("std::string"));
myFunc(testCallback);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgoKI2lmIDEKdGVtcGxhdGUgPHR5cGVuYW1lIEY+CmF1dG8gbXlGdW5jKEYgZikgLT4gZGVjbHR5cGUoIWYoJzAnKSwgc3RkOjpmdW5jdGlvbjxib29sKGNoYXIpPihmKSwgdm9pZCgpKSB7CiAgICBzdGQ6OmNvdXQgPDwgInN0ZDo6ZnVuY3Rpb248Ym9vbChjaGFyKT4gb3ZlcmxvYWQiIDw8IHN0ZDo6ZW5kbDsKfQojZWxzZQp0ZW1wbGF0ZSA8dHlwZW5hbWUgRj4Kdm9pZCBteUZ1bmMoRiBmLCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnN0cnVjdGlibGU8CiAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woY2hhcik+LCBGPjo6dmFsdWU+Ojp0eXBlKiA9IG51bGxwdHIpCnsKICAgIHN0ZDo6Y291dCA8PCAic3RkOjpmdW5jdGlvbjxib29sKGNoYXIpPiBvdmVybG9hZCIgPDwgc3RkOjplbmRsOwp9CiNlbmRpZgoKCnZvaWQgbXlGdW5jKGNvbnN0IHN0ZDo6c3RyaW5nICZzZXBlcmF0b3IpIHsKICAgIHN0ZDo6Y291dCA8PCAic3RkOjpzdHJpbmcgb3ZlcmxvYWQiIDw8IHN0ZDo6ZW5kbDsKfQoKYm9vbCB0ZXN0Q2FsbGJhY2soY2hhcikgewogICAgcmV0dXJuIHRydWU7Cn0KCmludCBtYWluKCkKewogICAgbXlGdW5jKCJTdHJpbmcgbGl0ZXJhbCIpOwogICAgbXlGdW5jKHN0ZDo6c3RyaW5nKCJzdGQ6OnN0cmluZyIpKTsKICAgIG15RnVuYyh0ZXN0Q2FsbGJhY2spOwp9Cg==