std::enable_if 和模板别名,阻止用户填写 std::enable_if 参数

std::enable_if and template alias, prevent user from filling in std::enable_if parameter

本文关键字:std if enable 用户 参数 别名      更新时间:2023-10-16

我正在使用这样的模板别名:

template <typename T, typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
using vec2 = std::pair<T, T>;
template <typename T, typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
using vec3 = std::tuple<T, T, T>;

问题是任何人都可以通过做vec2<int, any_type>来颠覆这一点。我该如何防止这种情况?

可以使用帮助程序别名。

template <typename T, typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
using vec2_impl = std::pair<T, T>;
template <typename T>
using vec2 = vec2_impl<T>;

现在,不能以任何方式使用名称vec2来生成std::pair<int, int>类型。

也就是说,正如评论中所述,这并不妨碍任何人以其他方式使用该类型,可能是直接使用 std::pair<int, int>,可能是通过编写 vec2_impl<int, void> ,但取决于你想使用它的目的,它可能足够好。

此外,如果您使用的是这样声明的模板函数:

template <typename T> void f(vec2<T>);

您无需执行任何其他工作:调用方已经完全无法传递任何std::pair<int, int>vec2<int, void>类型。 T可以推导出为int,但即使不使用任何辅助别名,以下替换已经失败。