确保可变参数函数中参数类型的一致性
在这种情况下,我们的目标是创建一个可以接受可变数量参数的函数,但要确保所有参数的类型相同。我们寻求在不诉诸数组或向量等额外数据结构的情况下实现这一目标。
可变参数函数
可变参数函数本身并不为其参数提供类型安全。为了强制类型一致性,请考虑使用可变参数模板函数。
可变参数模板函数
可变参数模板函数可以定义如下:
template<typename... Args> return_type function_name(Args...);
在此模板中,Args... 表示可以传递给函数的可变数量的参数。
类型检查强制
保证所有参数都是对于相同类型,我们可以使用SFINAE(替换失败不是错误)。 SFINAE 允许我们创建一个模板,在编译期间检测给定条件是 true 还是 false。
这里是一个示例:
template<typename R, typename... Args> struct fst { typedef R type; }; template<typename ...Args> typename fst<void, typename enable_if< is_convertible<Args, ToType>::value >::type... >::type f(Args...);
在此模板中,仅允许使用 f()接受可转换为 ToType 类型(表示所需参数类型)的参数。此配置拒绝任何不可转换为 ToType 的参数。
用例解决方案
对于您的特定用例,您可以使用以下内容:
template<typename ...Items> dragon_list_t make_dragon_list(Items... maidens) { std::array<Maiden, sizeof...(Items)> arr = {{ maidens ... }}; // here be dragons }
此模板将变量参数转换为 std::array
与 SFINAE 组合
将此方法与前面描述的 SFINAE 技术相结合,您可以创建拒绝任何不可转换为 Maiden 的参数的模板。
以上是如何在可变参数函数中强制类型一致性?的详细内容。更多信息请关注PHP中文网其他相关文章!