如果這個問題是基本的,我很抱歉。假設我有一個函式模板,它接受了一個引數包。我將如何多載它,以便可能對傳入的 2 個引數、傳入的 3 個引數等進行專門化。
uj5u.com熱心網友回復:
對于小引數包,我會使用非可變多載:
template <typename A, typename B> void foo(A a, B b);
template <typename A, typename B, typename C> void foo(A a, B b, C c);
如果您喜歡打包,可以使用requires或限制大小std::enable_if_t:
template <typename ...P> requires(sizeof...(P) == 2) void foo(P ...p);
template <typename ...P> requires(sizeof...(P) == 3) void foo(P ...p);
另一種選擇是使用單個可變引數函式,并使用 選擇行為if constexpr (sizeof...(P) == N)。
uj5u.com熱心網友回復:
您可以只多載函式模板,因為不可能部分專門化函式模板:
template<typename... T>
void f(T...)
{
std::cout << "variadic version called" << std::endl;
}
//overload for 2 args
template<typename T, typename V>
void f(T, V)
{
std::cout << "2 version called" << std::endl;
}
//overload for 3 args
template<typename T, typename V, typename U>
void f(T, V, U)
{
std::cout << "3 version called" << std::endl;
}
int main()
{
f(3,3,4,5); //calls #1
f(2,4.4); //calls #2
f(33,6,4); //calls #3
}
演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/511324.html
標籤:C 重载可变参数模板
上一篇:用于CGAL標頭的VSCode智能感知包括具有多個子檔案夾的
下一篇:可變引數模板方法特化
