【发布时间】:2020-05-21 23:33:58
【问题描述】:
我需要使用辅助函数检查 T 类型的值是否是它的任何参数。
例如,使用类似下面的代码
enum class my_enum{k1, k2, k3, k4, k5};
auto v{my_enum::k1};
if (is_any_of(v, my_enum::k1, my_enum::k4, my_enum::k5)) {
}
而不是使用if (v == my_enum::k1 || v == my_enum::k4 || v== my_enum::k5) {} 或switch-case。
如何在 C++11 中实现可变参数函数bool is_any_of()?
使用 C++17 折叠表达式如何让实现变得更简单?
【问题讨论】:
-
您是否假设参数的类型可能不同,如果是,是否应该将它们直接与
v和==进行比较,或者将它们转换为v的类型第一? -
参数的类型可能不同,可以直接与
==进行比较——这是我的假设。谢谢。 -
不是元编程专家,所以我无法提供
C++11版本,但C++17版本非常简单:template <typename... Ts> constexpr bool is_any_of(const my_enum value, Ts&& ... ts) { return ((value == ts) || ...); }。 -
@Fureeish 是的。这适用于 C++17 折叠表达式,更一般地与
template <typename T, typename ... Ts> constexpr bool is_any_of(T v, Ts&& ... ts) { return ((v == ts) || ...);一起使用,谢谢,但我正在寻找 C++11 解决方案,因为我目前正在研究 C++11 代码库。
标签: c++ c++11 c++17 variadic-templates variadic-functions