Wrap overloaded function via std::function

c++, c++11, overloading

Solution

That is ambiguous situation.

To disambiguate it, use explicit cast as:

typedef int (*funtype)(const std::string&);

std::function<int(const std::string&)> func=static_cast<funtype>(test);//cast!

Now the compiler would be able to disambiguate the situation, based on the type in the cast.

Or, you can do this:

typedef int (*funtype)(const std::string&);

funtype fun = test; //no cast required now!
std::function<int(const std::string&)> func = fun; //no cast!

So why `std::function<int(const std::string&)>` does not work the way `funtype fun = test` works above?

Well the answer is, because `std::function` can be initialized with any object, as its constructor is templatized which is independent of the template argument you passed to `std::function`.

Problem

I have an overloaded function which I want to pass along wrapped in a std::function. GCC4.6 does not find a "matching function". While I did find some questions here the answers are not as clear as I would like them. Could someone tell me why the following code can not deduct the correct overload and how to (elegantly) work around it? ``` int test(const std::string&) { return 0; } int test(const std::string*) { return 0; } int main() { std::function<int(const std::string&)> func = test; return func(); } ```

Original source