c++ - 将嵌套类型层次结构展平为 std::function 的线性类型序列
问题描述
考虑这个(不工作的)代码。
template<class A, class B>
struct Param {
typedef A A_t;
typedef B B_t;
};
template<class P>
struct FuncType
{
typedef std::function<void(typename P::A_t, typename P::B_t)> Func_t;
};
void foo(float a, float b,float c)
{
}
int main()
{
// this doesn't work, as 2nd parameter is nested
typedef Param< float , Param<float,float> > FloatFloatFloat;
FuncType<FloatFloatFloat>::Func_t f = foo;
f( .1 , .2 , .3 );
}
它适用于更简单的非嵌套参数构造:
void foo(float a, float b)
{
}
int main()
{
typedef Param< float , float > FloatFloat;
FuncType<FloatFloat>::Func_t f = foo;
这个想法是让FuncType
类模板Param
在模板参数可以是简单的内置 C++ 类型或Param
自身的类型上工作。换句话说:std::function
参数列表应该包含嵌套类型中包含的所有内置Param
类型。
这对 C++ 可行吗(可以是 C++20 之前的任何标准)?
解决方案
沿着这些思路,也许:
template<class A, class B>
struct Param {
typedef A A_t;
typedef B B_t;
};
template <typename T>
struct FlattenParam {
using type = std::tuple<T>;
};
template <typename A, typename B>
struct FlattenParam<Param<A, B>> {
using type = decltype(std::tuple_cat(
std::declval<typename FlattenParam<A>::type>(),
std::declval<typename FlattenParam<B>::type>()));
};
template<class P>
struct FuncType
{
template <typename ...Ts>
static std::function<void(Ts...)> helper(std::tuple<Ts...>);
using Func_t = decltype(helper(std::declval<typename FlattenParam<P>::type>()));
};
推荐阅读
- javascript - 如何将元素推入数组?
- javascript - 使用 if 语句取消选中 Jquery Checkbox
- c# - 移动图片框而不为每个图片创建 PictureBox_MouseDown
- mysql - 来自需要第三个依赖项的包的 npm 解析问题
- c++ - 我可以在不保存文件的情况下更改 FILE 变量的值吗?
- solr - Solr 中的词干参数
- android - 如何在 WorkManager 中处理 Rx?
- algorithm - 修正 Knight 旅行问题的最大流解
- java - 链接列表上的合并排序给我堆栈溢出
- ios - iOS 10-12 WebKit (Safari/Chrome) iframe 焦点错误的解决方法