[/ / Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd. / Copyright (c) 2003-2008 Peter Dimov / / Distributed under the Boost Software License, Version 1.0. (See / accompanying file LICENSE_1_0.txt or copy at / http://www.boost.org/LICENSE_1_0.txt) /] [section:faq Frequently Asked Questions] [section Why doesn't this compile?] See the dedicated [link bind.troubleshooting Troubleshooting section]. [endsect] [section Why does this compile? It should not.] Probably because you used the general `bind(f, ...)` syntax, thereby instructing `bind` to not "inspect" f to detect arity and return type errors. [endsect] [section:Q_forms What is the difference between `bind(f, ...)` and `bind(f, ...)`?] The first form instructs `bind` to inspect the type of `f` in order to determine its arity (number of arguments) and return type. Arity errors will be detected at "bind time". This syntax, of course, places some requirements on `f`. It must be a function, function pointer, member function pointer, or a function object that defines a nested type named `result_type`; in short, it must be something that `bind` can recognize. The second form instructs `bind` to not attempt to recognize the type of `f`. It is generally used with function objects that do not, or cannot, expose `result_type`, but it can also be used with nonstandard functions. For example, the current implementation does not automatically recognize variable-argument functions like `printf`, so you will have to use `bind(printf, ...)`. Note that an alternative `bind(type(), f, ...)` syntax is supported for portability reasons. Another important factor to consider is that compilers without partial template specialization or function template partial ordering support cannot handle the first form when `f` is a function object, and in most cases will not handle the second form when `f` is a function (pointer) or a member function pointer. [endsect] [section Does bind work with Windows API functions?] Yes, if you [link bind.implementation.stdcall `#define BOOST_BIND_ENABLE_STDCALL`]. An alternative is to treat the function as a [link bind.purpose.with_function_objects generic function object] and use the `bind(f, ...)` syntax. [endsect] [section Does bind work with COM methods?] Yes, if you [link bind.implementation.stdcall `#define BOOST_MEM_FN_ENABLE_STDCALL`]. [endsect] [section Does bind work with Mac toolbox functions?] Yes, if you [link bind.implementation.stdcall `#define BOOST_BIND_ENABLE_PASCAL`]. An alternative is to treat the function as a [link bind.purpose.with_function_objects generic function object] and use the `bind(f, ...)` syntax. [endsect] [section Does bind work with extern "C" functions?] Sometimes. On some platforms, pointers to extern "C" functions are equivalent to "ordinary" function pointers, so they work fine. Other platforms treat them as different types. A platform-specific implementation of `bind` is expected to handle the problem transparently; this implementation does not. As usual, the workaround is to treat the function as a [link bind.purpose.with_function_objects generic function object] and use the `bind(f, ...)` syntax. [endsect] [section Why doesn't bind automatically recognize nonstandard functions?] Non-portable extensions, in general, should default to off to prevent vendor lock-in. Had the [link bind.implementation.stdcall appropriate macros] been defined automatically, you could have accidentally taken advantage of them without realizing that your code is, perhaps, no longer portable. In addition, some compilers have the option to make `__stdcall` (`__fastcall`) their default calling convention, in which case no separate support would be necessary. [endsect] [endsect]