[英]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);
}
(當然,任何其他通用代碼都可以分解為一個單獨的通用函數,可能是可變參數函數模板。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.