相关疑难解决方法(0)

假定已知长度的模板参数包之后的可选参数

我试图拥有一种最后带有可选参数的“调用”函数:

template <typename... T>
void foo(void func(T...), T... args, int opt = 0)
{
    func(args...);
}

void bar(int, int);

int main()
{
    foo(&bar, 1, 2, 3);
}
Run Code Online (Sandbox Code Playgroud)

我本来希望这是可行的,因为参数包可以从第一个参数推导出来,但显然编译器有不同的想法:

例如,Clang 给出:

<source>:11:5: error: no matching function for call to 'foo'
    foo(&bar, 1, 2, 3);
    ^~~
<source>:2:6: note: candidate template ignored: deduced packs of different lengths for parameter 'T' (<int, int> vs. <>)
void foo(void func(T...), T... args, int opt = 0)
     ^
1 errors generated.
Compiler returned: 1
Run Code Online (Sandbox Code Playgroud)

为什么它会推导出长度为0的列表?args我可以为了扣除的目的而强制忽略它吗?或者更一般地说,我怎样才能做到这一点?

c++ templates optional-parameters variadic-templates

6
推荐指数
1
解决办法
969
查看次数

我可以在这里避免模板递归吗?

我写了一个for_eachtupleS:

template <typename Tuple, typename F, size_t begin, size_t end>
enable_if_t<begin == end || tuple_size<Tuple>::value < end> for_each(Tuple&, F&&) {
}

template <typename Tuple, typename F, size_t begin = 0U, size_t end = tuple_size<Tuple>::value>
enable_if_t<begin < end && tuple_size<Tuple>::value >= end> for_each(Tuple& t, F&& f) {
    f(get<begin>(t));
    for_each<Tuple, F, begin + 1, end>(t, forward<F>(f));
}
Run Code Online (Sandbox Code Playgroud)

[ 实例 ]

但是Yakk对这个问题的回答给出了一个很好的例子,说明如何处理非递归地在所有tuple值上运行lambda :

namespace detail {
    template<class F, class...Args>
    void for_each_arg(F&& f, Args&&...args) …
Run Code Online (Sandbox Code Playgroud)

c++ recursion tuples metaprogramming range

4
推荐指数
1
解决办法
435
查看次数