作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
尝试扩展此处找到的示例:https://stackoverflow.com/a/17974752
基本上,我想从自动传入的函数中推断出参数的数量(这显然不适用于重载函数)。我希望它也可以与仿函数和 lambda 一起使用。
无法编译对 call_helper
的调用: 错误:模板参数中的解析错误
我似乎无法弄清楚如何传入将参数数量作为模板参数返回的 constexpr。
这是我到目前为止所拥有的:
#include <vector>
template <typename R, typename ... T>
constexpr std::size_t get_args_count( R(*f)(T ...))
{
return sizeof...(T);
}
template< std::size_t... Ns >
struct indices {
typedef indices< Ns..., sizeof...( Ns ) > next;
};
template< std::size_t N >
struct make_indices {
typedef typename make_indices< N - 1 >::type::next type;
};
template<>
struct make_indices< 0 > {
typedef indices<> type;
};
void abc(int) {}
void abc2(int, int) {}
// helper function because we need a way
// to deduce indices pack
template<typename Func, size_t... Is>
void call_helper2(Func f, const std::vector<int>& args, indices<Is...>)
{
f( args[Is]... ); // expand the indices pack
}
template<typename Func, size_t N>
void call_helper(Func f, const std::vector<int>& args)
{
call_helper2(f, args, typename make_indices<N>::type());
}
template<typename Func>
void call(Func f, const std::vector<int>& args)
{
if (args.size() < get_args_count(f)) throw 42;
call_helper<get_args_count(decltype(f))>(f, args); // error: parse error in template argument list
}
int main()
{
struct F
{
void operator()(int, int, int, int) {}
};
std::vector<int> v(4);
call(&abc2, v);
call(&abc, v);
call([&](int, int, int) { (void)v.empty(); }, v);
call(F(), v);
}
最佳答案
有两个错误:
call_helper<get_args_count(decltype(f))>(f, args)
, get_args_count(decltype(f))
与 get_args_count
一样毫无意义采用函数指针而不是类型(显然); f
的参数数量尽快,在它变成可用于
constexpr
的表达式之前语境。
#include <vector>
template< std::size_t... Ns >
struct indices {
typedef indices< Ns..., sizeof...( Ns ) > next;
};
template< std::size_t N >
struct make_indices {
typedef typename make_indices< N - 1 >::type::next type;
};
template<>
struct make_indices< 0 > {
typedef indices<> type;
};
void abc(int) {}
void abc2(int, int) {}
// helper function because we need a way
// to deduce indices pack
template<typename Func, size_t... Is>
void call_helper2(Func f, const std::vector<int>& args, indices<Is...>)
{
f( args[Is]... ); // expand the indices pack
}
template<typename Func, size_t N>
void call_helper(Func f, const std::vector<int>& args)
{
call_helper2(f, args, typename make_indices<N>::type());
}
template<class R, class ... T>
void call(R(*f)(T ...), const std::vector<int>& args)
{
if (args.size() < sizeof...(T)) throw 42;
call_helper<
decltype(f), sizeof...(T)
>(f, args);
}
int main()
{
std::vector<int> v(2);
call(&abc2, v);
}
关于c++11 : Calling a variadic function with the elements of a vector, 并自动推断参数数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60119757/
我是一名优秀的程序员,十分优秀!