繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM