【发布时间】:2016-05-31 09:25:02
【问题描述】:
鉴于可调用函数C 的类型,我想在编译时获得std::function;其中的类型:
- 具有相同的函数返回类型
C - 参数类型是函数
C的第一个N参数类型
这意味着,对于给定类型void(int, char, double) 和给定N,函数的类型是:
-
N = 1=> 结果类型:std::function<void(int)> -
N = 2=> 结果类型:std::function<void(int, char)> -
N = 3=> 结果类型:std::function<void(int, char, double)> -
N > 3=> 编译时错误
例子:
template<std::size_t N, typename R, typename... A>
constexpr auto get() {
return /*(magically somehow)*/ std::function<R(FirstNFromA...)>
}
template<std::size_t N, typename R, typename... A>
struct S {
using func = decltype(get<N, R, A...>());
};
【问题讨论】:
-
很好的问答及其解决方案。似乎是一种编码乐趣。但是,我不明白,这将在哪里实际使用?在实际应用中,为什么有人要使用
FuncType<2, void(int, char, double, int)>::Type而不是简单的std::function<void(int, char)>!即使在模板内部,似乎也几乎不需要做这样的事情。要解决一个棘手的问题,有两种方法:要么得出同样困难的解决方案,要么使问题变得更简单。 :-) -
@iammilind 我在尝试用一堆 mixin 设计东西时遇到了问题。其中一个 mixin 获得一个可变类型的类型列表,其中最后一个是要继承的类型。不用说,第一个
N-1必须用作函数类型的参数。 :-)
标签: c++ templates c++14 variadic-templates std-function