【发布时间】:2014-05-01 18:55:54
【问题描述】:
在 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 的重载分辨率从对@987654325 的调用中延迟@ 对f 内部map 的调用。有没有人知道如何做到这一点?
这是我将重载函数的单个实例映射到元组上的代码(其中 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());
}
【问题讨论】:
-
我想出了一个部分解决方案:使用带有重载
operator()的可调用对象并将map签名更改为template<typename F, ...> ... map(F f, ...)。不过,将作用域中的重载函数捕获为可调用对象会很好! -
boost 已经有了这个,不是 stdlib 吗?
标签: c++ tuples overloading stdtuple