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
,但即使不使用任何辅助别名,以下替换已经失败。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- std::bind c++ in if statement
- 将while+if else转为更简单的std::remove_if
- "if (argc < 2 || argc > 2)"应该有 2 个参数吗?&终止在抛出'std::out_of_range'错误实例后调用
- std::cout doen不喜欢 std::endl 和 String in conditional-if
- static const std::map<string, int> vs if-elseif
- if(!getline(std::cin,str1))break;这个条件检查什么
- 是否可以在程序中使用 std::string 作为 if else 语句的一部分
- 不使用 if 插入/更新 std::unordered_map 元素的最快方法是什么
- 如果没有if,std::count_if会更快吗
- 在语句中调用 std::set 函数时出现意外"if"评估结果
- std::lock_guard在if块中的作用域
- 为什么在std::max实现中使用if-else而不是三元操作?