没有函数参数的可变参数模板

Variadic templates without function parameters

本文关键字:参数 变参 函数      更新时间:2023-10-16

我可以不使用模板参数作为函数参数来使用可变参数模板吗?

当我使用它们时,它会编译:

#include <iostream>
using namespace std;
template<class First>
void print(First first)
{
    cout << 1 << endl;
}
template<class First, class ... Rest>
void print(First first, Rest ...rest)
{
    cout << 1 << endl;
    print<Rest...>(rest...);
}
int main()
{
    print<int,int,int>(1,2,3);
}

但是当我不使用它们时,它不会编译并抱怨歧义:

#include <iostream>
using namespace std;
template<class First>
void print()
{
    cout << 1 << endl;
}
template<class First, class ... Rest>
void print()
{
    cout << 1 << endl;
    print<Rest...>();
}
int main()
{
    print<int,int,int>();
}

不幸的是,我想作为模板参数给出的类是不可实例化的(它们具有在模板函数内部调用的静态函数)。有没有办法做到这一点?

template<class First> // 1 template parameter
void print()
{
    cout << 1 << endl;
}
#if 0
template<class First, class ... Rest> // >=1 template parameters -- ambiguity!
void print()
{
    cout << 1 << endl;
    print<Rest...>();
}
#endif
template<class First, class Second, class ... Rest> // >=2 template parameters
void print()
{
    cout << 1 << endl;
    print<Second, Rest...>();
}

使其成为一种类型。

template <typename... Ts>
struct print_impl;
template <typename T>
struct print_impl<T> {
    static void run() {
        std::cout << 1 << "n";
    }
};
template <typename T, typename... Ts>
struct print_impl<T, Ts...> {
    static void run() {
        std::cout << 1 << "n";
        print_impl<Ts...>::run();
    }
};
template <typename... Ts>
void print() {
    print_impl<Ts...>::run();
}
int main() {
    print<int, int, int>();
    return 0;
}