gpt4 book ai didi

c++ - 在异构元组上映射 C++ 重载函数?

转载 作者:行者123 更新时间:2023-11-28 02:49:20 25 4
gpt4 key购买 nike

在 C++ 中,是否可以将重载函数映射到异构元组上?例如:

double f(dobule);
size_t f(std::string);

auto t = std::make_tuple(3.14, "a string");
// should be the same as std::make_tuple(f(std::get<0>(t)), f(std::get<1>(t)));
map(f, make_tuple(3.14, "a string")); // type std::tuple<double, size_t>

我可以编写一个映射函数,将 f 的相同重载实例映射到每个元组元素(下面的代码),但我看不到如何推迟 f 的重载解析 从调用 map 到调用 map 中的 f。有没有人想出如何做到这一点?

这是我的代码,用于将重载函数的单个实例映射到元组(其中 seq 和 gens 取自此答案 https://stackoverflow.com/a/7858971/431282 ):

// basically C++14's integer sequence
template<int ...>
struct seq { };

template<int N, int ...S>
struct gens : gens<N-1, N-1, S...> { };

template<int ...S>
struct gens<0, S...> {
typedef seq<S...> type;
};

template<typename R, typename A, typename ...B, int ...S> auto
map_1(R (*f)(A), std::tuple<B...> &&t, seq<S...>)
-> decltype(std::make_tuple(f(std::get<S>(t))...))
{
return std::make_tuple(f(std::get<S>(t))...);
}

template<typename R, typename A, typename ...B> auto
map(R (*f)(A), std::tuple<B...> &&t)
-> decltype(map_1(f, std::forward<std::tuple<B...>>(t), typename gens<sizeof...(B)>::type()))
{
return map_1(f, std::forward<std::tuple<B...>>(t), typename gens<sizeof...(B)>::type());
}

最佳答案

问题是它不能单独使用函数指针来完成,因为你想在它绑定(bind)到参数时解决函数重载。如果不执行重载解析,就无法获得指向函数的函数指针。关键是提供一个在调用时执行重载的函数对象,而不是在开始时尝试获取函数指针。

为此,我将主要功能声明为

template<typename Func, typename ...B> auto
map(Func&& f, std::tuple<B...> &&t)
-> decltype(map_1(std::forward<Func>(f), std::forward<std::tuple<B...>>(t), typename gens<sizeof...(B)>::type()))
{
return map_1(std::forward<Func>(f), std::forward<std::tuple<B...>>(t), typename gens<sizeof...(B)>::type());
}

然后以类似的方式定义map_1

然后你可以制作一个函数对象包装器

struct Wrapper
{
template<typename T>
auto operator()(T&& t) const -> decltype( f(std::forward<T>(t)) )
{
return f(std::forward<T>(t));
}
};

并用 map(Wrapper(), make_tuple(3.14, "a string")) 调用它

编辑:如果你有 C++14,你可以执行以下操作(感谢@MooingDuck 的启发)

#define BINDOVERLOADED(X) [](auto&& t) { return X(std::forward<decltype(t)>(t)); }
auto x = map(BINDOVERLOADED(f), make_tuple(3.14, "a string"));

参见 http://coliru.stacked-crooked.com/a/439f958827de8cf2

关于c++ - 在异构元组上映射 C++ 重载函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23414536/

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