【发布时间】:2014-12-07 01:03:00
【问题描述】:
我们如何实现一个可变参数模板,给定一个类型 T 和一个类型列表 E1、E2、... EN,根据重载决议确定从T 到该类型的转换最佳的列表类型?
void 应该是不存在最佳转换的输出 - 换句话说,当存在歧义或T 无法转换为列表中的任何类型时。
请注意,这意味着我们的模板应该对 SFINAE 友好,即在不存在最佳转换时不会出现硬错误。
以下static_asserts 应该会成功:
static_assert( std::is_same< best<int, long, short>, void >{}, "" );
static_assert( std::is_same< best<int, long, std::string>, long >{}, "" );
static_assert( std::is_same< best<int>, void >{}, "" );
(为简单起见,假设best 是一个引用实际模板的别名模板)
此案例未指定:
static_assert( std::is_same< best<int, int, int>, ???>{}, "" );
这里应该可以接受void 或int。 (如果选择后者,那么我们仍然可以在包装模板中检查结果类型是否在列表中包含两次,如果是,则输出void。
【问题讨论】:
标签: c++ type-conversion variadic-templates c++14 overload-resolution