我正在使用模板别名,如下所示:
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>
来颠覆这一点。我该如何防止这种情况?
答案 0 :(得分:2)
您可以使用辅助别名。
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
,但即使不使用任何帮助别名,以下替换也已失败。