重载具有相似参数的 C++ 函数
Overloading of C++ functions with similar arguments
我正在尝试创建以处理程序作为参数的函数的两个重载:
template <typename Handler>
void foo (Handler h);
如果处理程序将 boost::asio::yield_context 作为其参数,则应调用第一个重载,
template <class Handler>
void foo (Handler h,
enable_if_t<is_same<result_of_t<Handler (yield_context)>, void>::value>* = 0);
如果处理程序将 boost::function 作为其参数,则应调用第二个。
using func_type = boost::function<void(int,int)>;
template <typename Handler>
void foo (Handler h,
enable_if_t<is_same<result_of_t<Handler (func_type)>, void>::value>* = 0);
不幸的是,这不起作用:
main.cpp:22:3: error: call to 'foo' is ambiguous
foo ([] (func_type f) {});
^~~
main.cpp:11:6: note: candidate function [with Handler = (lambda at main.cpp:22:8)]
void foo (Handler h,
^
main.cpp:16:6: note: candidate function [with Handler = (lambda at main.cpp:22:8)]
void foo (Handler h,
^
1 error generated.
有趣,但代码与 std::function 一起工作正常:
using func_type = boost::function<void (int,int)>;
据我所知,这是因为 boost::function 对所有可能的调用运算符都有过多的重载,这会混淆 result_of 检查。
无论如何,是否可以在以 yield_context 和以 boost::function 作为参数的处理程序之间创建可以 "distinguish" 的 "foo" 重载?
Coliru 代码:http://coliru.stacked-crooked.com/a/18344cd1b8364466
标准库似乎采用了"moniker"参数方法:
unique_lock<mutex> lk(std::defer_lock, mx);
或
std::pair<Foo, Foo> p1(t, t);
std::pair<Foo, Foo> p2(std::piecewise_construct, t, t);
或
std::async(std::launch::deferred, foo, argument1);
std::async(std::launch::async, foo, argument1);
等等
规律是
struct defer_lock_t final { }; // for exposition
constexpr defer_lock_t defer_lock;
这些 "monikers" 具有 "unique" 可检测类型,保证不会 confusable/convertible 等与您的实际参数类型相同。
我正在尝试创建以处理程序作为参数的函数的两个重载:
template <typename Handler>
void foo (Handler h);
如果处理程序将 boost::asio::yield_context 作为其参数,则应调用第一个重载,
template <class Handler>
void foo (Handler h,
enable_if_t<is_same<result_of_t<Handler (yield_context)>, void>::value>* = 0);
如果处理程序将 boost::function 作为其参数,则应调用第二个。
using func_type = boost::function<void(int,int)>;
template <typename Handler>
void foo (Handler h,
enable_if_t<is_same<result_of_t<Handler (func_type)>, void>::value>* = 0);
不幸的是,这不起作用:
main.cpp:22:3: error: call to 'foo' is ambiguous
foo ([] (func_type f) {});
^~~
main.cpp:11:6: note: candidate function [with Handler = (lambda at main.cpp:22:8)]
void foo (Handler h,
^
main.cpp:16:6: note: candidate function [with Handler = (lambda at main.cpp:22:8)]
void foo (Handler h,
^
1 error generated.
有趣,但代码与 std::function 一起工作正常:
using func_type = boost::function<void (int,int)>;
据我所知,这是因为 boost::function 对所有可能的调用运算符都有过多的重载,这会混淆 result_of 检查。
无论如何,是否可以在以 yield_context 和以 boost::function 作为参数的处理程序之间创建可以 "distinguish" 的 "foo" 重载?
Coliru 代码:http://coliru.stacked-crooked.com/a/18344cd1b8364466
标准库似乎采用了"moniker"参数方法:
unique_lock<mutex> lk(std::defer_lock, mx);
或
std::pair<Foo, Foo> p1(t, t);
std::pair<Foo, Foo> p2(std::piecewise_construct, t, t);
或
std::async(std::launch::deferred, foo, argument1);
std::async(std::launch::async, foo, argument1);
等等
规律是
struct defer_lock_t final { }; // for exposition
constexpr defer_lock_t defer_lock;
这些 "monikers" 具有 "unique" 可检测类型,保证不会 confusable/convertible 等与您的实际参数类型相同。