4

我不确定这个问题是否已经回答。但它是这样的:

我想知道是否可以做类似的事情

template<typename...classes>
void createObject(){

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

}

我真的不明白它是如何工作的。我不能提供任何函数参数的原因是因为应该在方法中调用的模板函数只采用一种类型。这是因为它根据对象的类型返回一个对象。

有什么建议吗?

注意:GCC 4.6.2

4

2 回答 2

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

于 2012-06-25T06:22:44.587 回答
3

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

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

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

template <typename T>
void create() {
}

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

template <typename T>
int createHelper() {
    create<T>();
    return 0;
}

template<typename... Ts>
void createObject(){
    swallow(createHelper<Ts>()...);
}

编辑:我们可以使用逗号运算符来代替 createHelper:

swallow((create(), 0)...);
于 2012-06-25T08:15:37.863 回答