【发布时间】:2017-06-20 16:57:45
【问题描述】:
我有一个函数f1()
template <typename... Args>
void f1(Args... args)
{
// the implementation is just an example, I don't really need a complicated
// way to sum numbers
boost::fusion::vector<Args...> v(args...);
std::cout << boost::fusion::accumulate(v, 0, [](auto i1, auto i2) { return i1 + i2; }) << std::endl;
}
我想从函数f2() 调用它,但最后一个参数不同。有简单的方法吗?我尝试了一个幼稚的
template <typename... Args>
struct CallHelper;
template <>
struct CallHelper<>
{
template <typename... Args>
static void Apply(Args... args) { f1(args...); }
};
template <typename A0>
struct CallHelper<A0>
{
template <typename... Args>
static void Apply(Args ...args, A0 a0)
{
// substitute 10 to the last argument
CallHelper<>::Apply(args..., 10);
}
};
template <typename Head, typename ...TailArgs>
struct CallHelper<Head, TailArgs...>
{
template <typename... Args>
static void Apply(Args... args, Head head, TailArgs ...tailArgs)
{
CallHelper<TailArgs...>::Apply(args..., head, tailArgs...);
}
};
template <typename... Args>
void f2(Args... args)
{
CallHelper<Args...>::Apply(args...);
}
当然不行,因为Head head 不是第一个参数。也许还有一种方法可以使Head head 成为参数包?或者还有什么我可以做的吗?
【问题讨论】:
-
试试
template <typename... Args,typename Last> -
我现在无法使用 PC,但可以尝试将
conditional_t<integer_sequence == n, Args, int>...和sizeof...(Args)结合起来,对于变量,写一个replace_if<condition>(T, int)和if constexpr
标签: c++ templates c++14 variadic-templates generic-lambda