2013-01-14 90 views
0

說我有一個接受可變參數和使用這些參數調用的其他函數的模板函數...傳遞變量參數在C++可變參數模板

template<typename... A> func(int i, A... args) 
{ 
    // do something common 

    switch (i) 
    { 
    case 0: x(args...); break; 
    case 1: y(args...); break; 
    case 2: z(args...); break; 

    default: break; 
    } 

    // do something common 
} 

...和其他功能被定義爲.. 。

void x(int a, int b); 
void y(int a, int b); // note: takes same args as x() 
void z(std::string a); 

這並不編譯,因爲調用FUNC()用的std :: string參數不會找到X()的匹配而這需要一個std :: string參數Y()。

請注意,func()使用一些外部條件(本例中參數i的值)來決定將參數args傳遞給哪個其他函數。

有沒有辦法將這個關閉而不訴諸像填充參數參數到一個std:tuple和傳遞?

[編輯]

好吧,我想通了,作品不夠好,我的目的的方法。下面是一個例子類來說明......

class X 
{ 
    private: 

    bool a(int) { return true; } 
    bool b(int) { return true; } 

    template<typename... A> bool a(const A&...) { return false; } 
    template<typename... A> bool b(const A&...) { return false; } 

    public: 

    template<typename... A> void x(int i, const A&... args) 
    { 
     if (i == 0) 
     { 
      a(args...); 
     } 
     else 
     { 
      b(args...); 
     } 
    } 
}; 

爲()和b的可變參數模板()的方法將捕獲),其中的參數是不是一個單一的int x.x中(撥打和接聽電話。這解決了我收到的編譯器錯誤,並啓用了我一直在尋找的更簡單的類API。

+1

你將不得不使用專業化/ SFINAE。 –

回答

2

是,使不同的重載:

template <typename A1> 
func(A1 arg1) 
{ 
    x(arg1); 
} 

template <typename A1, typename A2> 
func(A1 arg1, A2 arg2) 
{ 
    y(arg1, arg2); 
} 

template <typename A1, typename A2, typename A3> 
func(A1 arg1, A2 arg2, A3 arg3) 
{ 
    z(arg1, arg2, arg3); 
} 

(任何額外的,常見的代碼當然可以被分解成一個單獨的,共同的功能,可能是一個可變參數函數模板)

+0

不是我一直在尋找的東西,但是沒有提供足夠的信息是我的錯。 func()可能會調用其他採用相同參數類型的方法(例如,a(int)和b(int)),但會根據其他條件(例如,i的值)決定要調用哪個方法。我將編輯該問題以清除該問題。 – user1715664

+0

我使用的用例是一個狀態機,其中傳入事件類型及其數據。根據當前狀態和事件類型,調用適當的事件處理程序來處理數據並可能使狀態機進入狀態。 – user1715664

+0

@ user1715664:這聽起來更像是一個* dynamic *問題,而不是一個靜態問題。 –

0

看看這篇文章我知道你可以使用...作爲參數來告訴你正在使用可變數量的參數。

... syntax in C++

這是很好的註釋代碼又如: Functions with Variable Argument Lists in C and C++ using va_list

我希望這有助於。

+1

Argh。請不要在C++問題上發佈'va_list' *永遠*。 –

+1

@BartekBanachewicz你能解釋一下你的擔憂嗎? –

+0

@ user1715664您如何看待我在上面發佈的解決方案? –