C ++函数:没有参数的可变参数模板

时间:2012-06-25 06:12:46

标签: c++ templates types variadic-templates

我不确定这个问题是否已经得到解答。但在这里:

我想知道是否可以做类似

的事情
template<typename...classes>
void createObject(){

  //pass each type into my template function wich takes one type only.

}

我真的不知道它究竟是如何运作的。我无法提供任何函数参数的原因是因为我在模板中调用的模板函数只需要一种类型。这是因为它根据类型返回一个对象。

有什么建议吗?

注意: GCC 4.6.2

2 个答案:

答案 0 :(得分:4)

template<typename...>
struct caller;

template<typename T, typename...Rest>
struct caller<T, Rest...>
{
     static void call()
     {
        create<T>();
        caller<Rest...>::call();
     }
};

template<>
struct caller<>
{
     static void call()
     {
     }
};

//since you've not mentioned the return type, I'm assuming it to be void
//if it is not void, then I don't know what you're going to return, and HOW!   
template<typename...classes>
void createObject(){
      caller<classes...>::call();
}

演示:http://ideone.com/UHY8n


替代品(较短版本):

template<typename...>
struct typelist{};

template<typename T, typename ... Rest>
void call(typelist<T,Rest...>)
{
  create<T>();
  call(typelist<Rest...>());
};

void call(typelist<>) { }

template<typename...classes>
void createObject(){
      call(typelist<classes...>());
}

演示:http://ideone.com/cuhBh

答案 1 :(得分:2)

一种方法是使用以下函数来扩展调用:

template <typename... Ts>
void swallow(Ts&&...) {
}

我假设您要调用以下函数:

template <typename T>
void create() {
}

在这种情况下,您需要一个帮助函数将void create转换为返回某个函数的函数,以便我们可以在swallow的arg-list中展开它(如果您的{ {1}}函数已经非空,那么这个额外的步骤是不必要的):

create