[英]std::enable_if and template alias, prevent user from filling in std::enable_if parameter
我正在使用模板别名,如下所示:
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
,但是即使没有使用任何辅助别名,以下替换也已经失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.