相关疑难解决方法(0)

"手动"签名重载决议

我想创建一个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)

c++ templates overload-resolution c++11

8
推荐指数
1
解决办法
485
查看次数

标签 统计

c++ ×1

c++11 ×1

overload-resolution ×1

templates ×1