我想创建一个std::function类似的对象,可以处理存储多个重载.
语法排序如下:my_function< int(double, int), double(double, double), char(int, int) >.
或者,更明确地说:
template<typename... Ts>
struct type_list {};
template<typename... Signatures >
struct my_function {
std::tuple< std::function<Signatures>... > m_functions;
typedef type_list< Signatures... > sig_list;
template<typename... Args>
typename pick_overload_signature< sig_list, type_list<Args...> >::return_value
operator()( Args&&... args )
{
return get<pick_overload_signature< sig_list, type_list<Args...> >::index>(m_functions)(std::forward<Args>(args)...);
}
};
Run Code Online (Sandbox Code Playgroud)
我的问题:我该怎么写pick_overload_signatures?
以下是我所做的工作:
我倾向于在函数签名上写一个关于给定参数集的部分顺序,然后对函数签名的类型列表进行排序,然后获取最佳(可能是编译时断言,最好的一个是唯一的).为了解决这个问题,我必须在函数签名上有一个可靠的部分顺序(相对于传入的一组参数)...
13.3.3.1告诉我如何确定是否有有效的转换.我可以通过使用编译器为我做转换来欺骗这个,并使用SFINAE来检测传入的给定参数是否发生以及其中一个"重载"的签名.
13.3.3.2告诉我如何订购这些转换.在这里,我必须检测转换序列是用户定义还是标准序列.我不确定如何区分这两者.
也许我可以使用traits类来检测用户定义的转换序列的存在.检查的存在&S::operator D()和&D::D(S const&)和&D::D(S)和&D::D(S&&)或类似的东西.
has_user_defined_conversion<S,D>::value,has_standard_conversion<S,D>::value等?
这种方法是否有效,有人已经完成了,或者有人已经完成了部分工作吗?
#include <type_traits>
#include …Run Code Online (Sandbox Code Playgroud)