#include <iostream>
#include <memory>
#include <typeinfo>
#include <cstdlib>
#include <cxxabi.h>
template <typename T>
std::unique_ptr<char, void(*)(void*)>
type_name()
{
return std::unique_ptr<char, void(*)(void*)>
(
__cxxabiv1::__cxa_demangle(typeid(T).name(), nullptr,
nullptr, nullptr),
std::free
);
}
void display() {}
template <class T>
void
display()
{
std::cout << type_name<T>().get() << ' ';
}
template <class T, class T2, class ...Tail>
void
display()
{
std::cout << type_name<T>().get() << ' ';
display<T2, Tail...>();
}
template <class... Ts>
struct A
{
template <class... Us>
static
int
hun(Us... us)
{
std::cout << "A<";
display<Ts...>();
std::cout << ">::hun(";
display<Us...>();
std::cout << ")\n";
return 0;
}
};
template <class ...T>
void gun(T...) {}
template <class... Ts> void fun(Ts... vs)
{
std::cout << "gun(A<Ts...>::hun(vs)...);\n";
gun(A<Ts...>::hun(vs)...);
std::cout << "\ngun(A<Ts...>::hun(vs...));\n";
gun(A<Ts...>::hun(vs...));
std::cout << "\ngun(A<Ts>::hun(vs)...);\n";
gun(A<Ts>::hun(vs)...);
}
int main()
{
fun(1, 'a', 2.3);
}
輸出:
gun(A<Ts...>::hun(vs)...);
A<int char double >::hun(int)
A<int char double >::hun(char)
A<int char double >::hun(double)
gun(A<Ts...>::hun(vs...));
A<int char double >::hun(int char double)
gun(A<Ts>::hun(vs)...);
A<int >::hun(int)
A<char >::hun(char)
A<double >::hun(double)
[Variadic Templates pack expansions](http://stackoverflow.com/questions/9182251/variadic-templates-pack-expansions) – kennytm 2012-03-10 22:56:44
@KennyTM不是重複的。這個人想要每種擴展類型的例子(不一定只有那三個alexandrescu顯示的,他展示的只是兩種類型的擴展(一個到模板參數列表,一個到函數參數列表))。 – 2012-03-11 13:39:46
...但是,當他接受一個只顯示這兩種擴展類型的答案時,我想這個問題是不準確的,或者我對問題或兩者缺乏理解...... – 2012-03-11 13:41:21