2017-08-12 35 views
2

我正在研究可变参数模板,我想知道如果我可以做这样的事情:我会调用任意数量的函数(任意返回类型)与任意数量和类型的参数只需一个电话。我能够使用的代码是这样的:variadic模板C++中的多个参数包

call(f1,f2,f3, 2.2,3); 
call(f4,f5, 2.2, "Hello", 'a'); 

如果函数传递可以接受传递的参数。 我写了一个固定数目的要传递给函数的参数兼容版本:

template<typename T, typename U> 
void fcall(const T& t1, const T& t2, U&& u){ 
    u(t1, t2); 
} 

template<typename... F, typename T, typename U> 
void fcall(const T& t1, const T& t2, U&& u, F&&... f){ 
    u(t1, t2); 
    fcall(t1, t2, f...); 
} 

即使我不喜欢的功能之前传递参数,它的工作原理。

这是我写的,并且不工作:

template<typename P, typename U> 
void fcall2(U&& f, const P& param){ 
f(param); 
} 

template<typename... P, typename... F, typename U> 
void fcall2(U&& f, F&&... func, const P&... param){ 
f(param...); 
fcall2(func..., param...); 
} 

我知道了也没用,这只是一个好奇心。 有什么建议吗?

回答

1

你只能有一个这样的包。

理论上,您可以在包中找到独特的分割点,在使用愚蠢复杂的模板元编程之后,元素可以先用元素调用。

更容易将写:

template<class...Fs> 
auto call_all(Fs...fs){ 
    return [&](auto&&...args){ 
    (void(fs(args...)),...); 
    }; 
} 

(C++ 17)。

使用,如:

call_all(f1,f2,f3)(3.13, "hello");