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

时间:2014-12-28 08:51:07

标签: c++ c++11

我正在使用模板别名,如下所示:

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>来颠覆这一点。我该如何防止这种情况?

1 个答案:

答案 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,但即使不使用任何帮助别名,以下替换也已失败。