2014-12-03 81 views
1

我可以創建一個模板類,它將某些值存儲在屬性中,並讓我稍後調用一個使用此參數調用函數的方法。像這樣:可變參數模板類用於對可變參數模板函數進行延期調用

template <typename U> void g(U u) { cout << u << endl; } 
template <typename U> class C { 
public: 
     U u; 
     C(U u) { this->u = u; } 
     void m() { g(u); } 
}; 

int main() { 
     C<double> c(5.5); 
     c.m(); 
} 

但是如何使可變參數模板相同?我想編寫類似:

template <typename ... T> void f(T... a) { cout << "generik" << endl; } 

template <typename ... T> class B { 
    public: 
     T... arg; 
     B(T... arg) { 
      this->arg = arg; 
     } 
     void m() { f(arg); } 
}; 

int main() { 
    B<int,double> b(1,1.1); 
    b.m(); 
} 

我知道,這將無法工作,因爲我們不能宣佈解壓參數類型的成員。

我可以爲列表中的某些參數做模式匹配,然後在給定給定數量的參數的情況下調用該函數,但我想以通用方式執行此操作。有沒有一種優雅的方式來做到這一點?

+0

使用'的std :: tuple' – 2014-12-03 20:14:40

+0

你的第一個例子未能完全向前爲好。你是否打算不止一次地叫'm'?也許只有'&&'超負荷才能完美向前... – Yakk 2014-12-03 20:17:25

+0

這不是重點,但謝謝。 – 2014-12-03 21:06:46

回答

1

http://ideone.com/OPl7Rz

#include <iostream> 
#include <functional> 

using namespace std; 

template<typename... T> 
void f(T... a) 
{ 
    std::initializer_list<int> {(std::cout<<a<<" ", 0)...}; 
} 

template<typename... T> 
class Defer 
{ 
    private: 
     std::function<void()> func; 

    public: 
     Defer(T... a) : func(std::bind(f<T...>, a...)) {} 
     void call() {func();} 
}; 



int main() 
{ 
    Defer<int, float, int, const char*> d(1, 1.1, 2, "Hey"); 
    d.call(); 
    return 0; 
} 
+0

謝謝@Brandon,這符合我的需求和他的完美優雅!不知道爲什麼我沒有想到綁定(需要挖掘更多可變參數模板和標準庫)。 – 2014-12-03 21:02:35

2

您可以使用類似以下內容:

template <typename... Ts> class B 
{ 
public: 
    std::tuple<Ts...> t; 
    B(Ts... args) 
     : t(args...) 
    { 
    } 
    void m() { call_f(std::index_sequence_for<Ts>()); } 

private: 
    template <std::size_t ... Is> 
    void call_f(std::index_sequence<Is...>) 
    { 
     f(std::get<Is>(t)...); 
    } 
}; 

注意std::index_sequence_forstd::make_index_sequence)和std::index_sequence是C++ 14,但也可以用C++編寫11。

Live example

+2

可能想提一下'make_index_sequence'的功能。或者我猜他們可以谷歌它。 'index_sequence_for '也可能比'make_index_sequence 更好。 – Yakk 2014-12-03 20:16:55

+0

感謝你們的好回覆,但我更喜歡@布蘭登的回答:它完全符合C++ 11標準,並且更簡單一些。即使你的存儲數據而不是函數調用...我猶豫了... – 2014-12-03 21:05:46