2017-08-12 37 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");