gpt4 book ai didi

c++ - 获取 std::tuple 满足特征的第一个元素

转载 作者:搜寻专家 更新时间:2023-10-31 02:04:36 27 4
gpt4 key购买 nike

我正在使用 C++17。我想获得满足某种类型特征的元组元素。如果可以通用地提供该特性,那将是令人惊奇的,但我会对某个特性的特定功能感到满意。用法可能看起来像这样:

auto my_tuple = std::make_tuple { 0.f, 1 };

auto basic = get_if_integral (my_tuple);
auto fancy = get_if<std::is_floating_point> (my_tuple);

std::cout << basic; // '1'
std::cout << fancy; // '0.f'

理想情况下,如果不止一个元素满足该特征,这将无法编译,例如 std::get (std::tuple)

最佳答案

这里有一个不使用递归的非常简单的方法:

template <template <typename...> typename T, typename... Ts>
constexpr int index_of_integral(const T<Ts...>&)
{
const bool a[] = { std::is_integral_v<Ts>... };
for (int i = 0; i < sizeof...(Ts); ++i) if (a[i]) return i;
return -1;
}

template <typename T>
constexpr decltype(auto) get_if_integral(T&& t)
{
return std::get<index_of_integral(t)>(std::forward<T>(t));
}

int main()
{
constexpr auto t = std::make_tuple(3.14, 42, "xyzzy");
static_assert(get_if_integral(t) == 42);
}

它可以很容易地扩展以在特征上进行参数化。

唯一让它成为 C++17 的是 is_integral_v 变量模板和单参数 static_assert。其他一切都是 C++14。

请注意,在 C++20 中,for 循环可以替换为 std::findstd::distance

理想情况下,它应该抛出异常而不是返回 -1,但编译器似乎不喜欢那样。

灵感来自 this answer .

关于c++ - 获取 std::tuple 满足特征的第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53250540/

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