簡體   English   中英

在C ++可變參數模板中傳遞變量參數

[英]Passing variable arguments in a C++ variadic template

假設我有一個模板函數,它接受變量參數並使用這些參數調用其他函數...

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);

這不會編譯,因為使用std :: string參數調用func()不會找到采用std :: string參數的x()和y()匹配項。

請注意,func()使用某些外部條件(在此示例中為參數i的值)來確定將參數args傳遞給哪個其他函數。

有沒有辦法在不借助將參數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...);
        }
    }
};

用於a()和b()的可變參數模板方法將捕獲對參數不是單個int的Xx()的任何調用。 這解決了我收到的編譯器錯誤,並啟用了我正在尋找的更簡單的類API。

是的,進行單獨的重載:

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);
}

(當然,任何其他通用代碼都可以分解為一個單獨的通用函數,可能是可變參數函數模板。)

看一下這篇文章,我知道您可以使用...作為參數來告訴您正在使用數量可變的參數。

... C ++中的語法

這是另一個代碼注釋良好的示例: 使用va_list在C和C ++中具有可變參數列表的函數

我希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM