- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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"));
关于c++ - 在异构元组上映射 C++ 重载函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23414536/
我有一个 NSTreeController (向 NSOutlineView 提供内容)。我希望顶级对象属于一个类,而所有其他对象(因此,任何级别的子对象)属于另一个类。解决这个问题的最佳方法是什么?
我有一个如下所示的 GADT data MyTypes = MyInt | MyDouble data Test (t :: MyTypes) where A :: Int -
我需要一个高效的异构数组,其中第一个元素是 int,其余是 float。然而,创建它之后,基本的数组操作就会呈爆炸式增长。 A = np.zeros(1, dtype='i4, f4, f4') B
我有一个 pandas DataFrame,其中包含需要拆分成平衡切片的字符串和浮点列,以便训练 sklearn 管道。 理想情况下,我会使用 StratifiedKFold在 DataFrame 上
是否有一种异构容器的形式,能够存储例如不同的基本类型(例如int、float、double)? 最终我希望能够在计算中使用元素而无需显式引用类型,例如 auto res = a + b,其中操作数 a
假设我有一个结构(或类),如下所示: struct _particle { std::vector vx , vy; std::vector id; std::vector rx, ry; }; ty
我在将具有 > 22 列的表专门映射到 case class 时遇到问题,假设您有以下代码 import slick.driver.PostgresDriver import scala.slick.
我是一名优秀的程序员,十分优秀!