C++可变参函数模板

可变参模板的英文为Variadic Templates,是C++11标准引入的,可变参模板允许模板定义中含有0到多个模板参数。

template <typename... T>
void myvtfunct(T... args)
{
    cout << sizeof...(args) << endl;
    cout << sizeof...(T) << endl;
}

typename后面的3个点代表参数包,然后才修饰T。T后面带了3个点,所以将T称为可变参类型,实际上其中包含了0到多个不同的类型(一包类型),args成为一包或一堆参数。

可变参函数模板的展开一般是用递归函数。

template <typename T, typename... U>
void myvtfunct(T firstarg, U... otherargs)
{
    cout << firstarg << endl;
    myvtfunct(otherargs...);
}

void myvtfunct()
{
}

在C++17标准中,引入了编译期间if语句,在if后面又增加了一个constexpr关键字,这个关键字代表常量或编译期求值。通过编译期间if语句,可以把上述递归终止函数省略。

template <typename T, typename... U>
void myvtfunct(T firstarg, U... otherargs)
{
    cout << firstarg << endl;
    if constexpr (sizeof...(otherargs) > 0) {
        myvtfunct(otherargs...);
    }
}

可变参函数模板也可以重载。

template <typename... T>
void myfunc(T... arg)
{
}

template <typename... T>
void myfunc(T*... arg)
{
}

void myfunc(int arg)
{
}

一般来讲,当调用一个普通函数和调用实例化后的函数模板都合适的时候,编译器会优先选择普通函数。


Top