std::make_tuple,并在c++20中输入一个操作过的std::tuple unsing概念



请考虑以下为c++20编写的godbolted代码:

#include<iostream>
#include<tuple>
template <typename T, std::size_t ...I, typename F>
void tuple_foreach_impl(T&& tuple, std::index_sequence<I...>, F&& func)
{
using dummy_array = int[];
dummy_array{(void(func(std::get<I>(tuple))), 0)..., 0};
}
template <typename T, typename F>
void tuple_foreach(T&& tuple, F&& func)
{
constexpr int size = std::tuple_size<std::remove_reference_t<T>>::value;
tuple_foreach_impl(std::forward<T>(tuple), std::make_index_sequence<size>{},
std::forward<F>(func));
}
template<typename T>
concept IsOfTypeInt = std::same_as<T, int>;
template<typename T>
concept IsNotOfTypeInt = not IsOfTypeInt<T>;
template<IsOfTypeInt T>
int* ToPtrIfInt(T& arg) { return &arg;}
template<IsNotOfTypeInt T>
T& ToPtrIfInt(T& arg) { return arg;}
template <typename... T, std::size_t... I>
auto ConvertTupleImp(const std::tuple<T...>& t, std::index_sequence<I...>)
{
return std::make_tuple(ToPtrIfInt(std::get<I>(t))...);
}
int main()
{
auto t1 = std::make_tuple(1.1,3.14159,42);
auto t2 = ConvertTupleImp(t1, std::make_index_sequence<3>());
tuple_foreach(t2, [](auto&& value)
{
std::cout << value << std::endl;
});
}

输出显示:

Program returned: 0
1.1
3.14159
42

函数ToPtrIfInt的目的是如果输入是int类型,则返回指向输入int的指针。在任何其他情况下,ToPtrIfInt都应该返回输入对象。正如您在输出中看到的,最后一个元素(值42(没有转换为其指针。所以代码不起作用。我的猜测是我必须使用ToPtrIfInt(std::forward<…>(std::get<I>(t)))...,但我无法使用它。感谢您的帮助。

您有一个常量问题:您的元组是常量,所以您传递了const int&,而const int不是int。删除const解决您的问题:

template <typename... Ts, std::size_t... Is>
auto ConvertTupleImp(std::tuple<Ts...>& t, std::index_sequence<Is...>)
{
return std::make_tuple(ToPtrIfInt(std::get<Is>(t))...);
}

演示

或者,你可以改变你的概念来处理const(和引用(

template<typename T>
concept IsOfTypeInt = std::same_as<std::decay_t<T>, int>;

您必须修复ToPtrIfInt的实现才能获得正确的返回。

演示

相关内容

最新更新