gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:57:58 25 4
gpt4 key购买 nike

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

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

关于c++ - std::enable_if 和模板别名,防止用户填写 std::enable_if 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27674948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com