C++函数:不带参数的可变参数模板

4

我不确定这个问题是否已经被解答了。但是,这里是问题:

我想知道是否可以做类似于

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

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

}

我真的不太明白它是如何工作的。我无法提供任何函数参数的原因是,我的模板函数只接受一种类型,而这个方法内部应该调用该模板函数。这是因为它根据其类型返回对象。

有什么建议吗?

注意: GCC 4.6.2


1
你能更准确地说明这个函数应该做什么以及它应该返回什么吗?返回的对象之间是否有共同的类型? - Emilio Garavaglia
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...>());
}

Demo : http://ideone.com/cuhBh


1
是的,它应该是void。您能否详细说明您正在做什么?我意识到它变成了递归。但是我不知道如何实现。 您似乎声明了两次“call”。 - Sidar
@Sidar:在C++中搜索元编程;看一些例子,这将帮助你入门,这将使我更容易解释我所做的。否则,我将不得不花费很多时间在此处键入迷你教程(我现在无法完成,因为我在办公室)。 - Nawaz
好的,谢谢你的回答。 - Sidar

3
一种方法是使用以下函数来扩展调用:
template <typename... Ts>
void swallow(Ts&&...) {
}

我会假设您想调用以下函数: ```html

我会假设您想调用以下函数:

```
template <typename T>
void create() {
}

在这种情况下,您需要一个帮助函数来将void create转换为返回值的函数,以便我们可以在swallow的参数列表中扩展它(如果您的create函数已经是非void,则此额外步骤不是必需的):
template <typename T>
int createHelper() {
    create<T>();
    return 0;
}

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

编辑:我们可以使用逗号运算符的技巧,而不是使用createHelper函数:
swallow((create(), 0)...);

我使用Ts&& ...将下一个类型前进?但是这个并不完全是递归,对吗? - Sidar
不,这不是递归的。swallow 的参数列表的目的在于它可以绑定到任何东西(实际上我们并没有对参数做任何操作,正如你所看到的,整个调用将被优化掉)。这只是一种在某些情况下扩展模板参数包的简单方法。 - mitchnull
1
我还没有完全理解它背后的概念。不过无论如何,谢谢你的贡献。目前为止,我已经解决了我的问题。以后可能会再回来看这个。 - Sidar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接