2016-01-12 85 views
3

是否有在C++中的任何方式14分之11寫可變參數模板函數是這樣的:模板函數結合元組的元素的可變參數數到另一個函數作爲參數

template <typename ReturnType, typename Args...> 
std::function<ReturnType()> bindArgumentsFromTuple 
            (std::function<ReturnType(Args... args)> f, 
            const std::tuple<Args...>& t) 

結合的元組噸元件起作用f作爲參數(例如,元素的數量及其類型在函數參數和元組中是相同的)?用法

例子:

void dummy_print(int i, double d) 
{ 
    std::cout << i << "," << d << '\n'; 
} 
void dummy_print2(int i, double d, std::string& s) 
{ 
    std::cout << i << "," << d << "," << s << '\n'; 
} 

int main() { 
    std::tuple<int,double> t(77,1.1); 
    std::tuple<int,double,std::string> t2(1,2.0,"aaa"); 
    auto f1 = bindArgumentsFromTuple(dummy_print, t); 
    f1(); 
    auto f2 = bindArgumentsFromTuple(dummy_print2, t2); 
    f2(); 

    return 0; 
} 

回答

3
template <typename F, typename T, std::size_t... indices> 
auto bindTuple(F&& f, T&& t, std::index_sequence<indices...>) { 
    return std::bind(std::forward<F>(f), std::get<indices>(std::forward<T>(t))...); 
} 

template <typename F, typename T> 
auto bindTuple(F&& f, T&& t) { 
    return bindTuple(std::forward<F>(f), std::forward<T>(t), 
        std::make_index_sequence<std::tuple_size<std::decay_t<T>>{}>{}); 
} 

以上將支持任何元組式的,即std::arraystd::tuple等,而關於placeh較舊的論點。 Demo

+0

謝謝!這是我在C++中的另一個知識缺口:'std :: index_sequence' :) – attuda

+0

在第一次重載時,你不會多次轉發't'(可能移動它)嗎? – 0x499602D2

+2

@ 0x499602D2我正在轉發它,所以'std :: get'可以相應地轉發元組的元素,儘可能避免複製 – Columbo

1

隨着std::index_sequence,你可以這樣做:

template <typename ReturnType, typename ...Args, std::size_t ... Is> 
std::function<ReturnType()> 
bindArgumentsFromTuple_impl(std::function<ReturnType(Args...)> f, 
         const std::tuple<Args...>& t, std::index_sequence<Is...>) 
{ 
    return [=]() { return f(std::get<Is>(t)...);}; 
} 

template <typename ReturnType, typename ...Args> 
std::function<ReturnType()> 
bindArgumentsFromTuple(std::function<ReturnType(Args...)> f, 
         const std::tuple<Args...>& t) 
{ 
    return bindArgumentsFromTuple_impl(f, t, std::index_sequence_for<Args...>{}); 
} 

Live Demo

+1

'std :: function'?真的嗎? – Columbo

+0

我保留了OP的簽名,但你是對的,你的方式更好。 – Jarod42

+2

OP接受帶有非const引用的字符串;我懷疑他知道什麼對他最好:-) – Columbo

相關問題