在Variadic模板中调用对象的函数

时间:2015-01-22 00:37:06

标签: c++ variadic-templates

我有一个可以容纳不同数据类型的模板对象,以及一个名为get()的方法。 get()会将投射的数据类型的值返回给int

template <class T> 
class A
{
    public:
    int get()
    {
        return (int) m_val;
    }

    void set(T t)
    {
        m_val = t;
    }

    private:
    T m_val;
};

我还有一个可变参数模板函数,可以接收A的多个对象,并调用它们的get()方法,将值相加并返回结果。但是,我对可变参数模板相当新,并且不知道我在做什么。在环顾四周之后,这就是我所得到的:

//Ensure only types of A can be used for getStuff
template <>
int getStuff<A>(A... t)
{
    int val = 0;
    val = val + (t...).get();
}

int main() {
    A<int> a;
    A<char> b;

    a.set(5);
    b.set(100);

    int val = getStuff(a, b);
    printf("%d", val);
    return 0;
}

显然,这不会编译。我究竟做错了什么?我是否需要获得指向每个不同A的指针并迭代它们?

prog.cpp:23:13: error: expected initializer before '<' token
 int getStuff<A>(A... t)
             ^
prog.cpp: In function 'int main()':
prog.cpp:37:25: error: 'getStuff' was not declared in this scope
  int val = getStuff(a, b);

1 个答案:

答案 0 :(得分:4)

你很亲密!这是一种非递归方式,包括免费的完美转发:

template <class... As>
int getStuff(As&&... as)
{
    int val = 0;
    for(int i : {std::forward<As>(as).get()...})
        val += i;

    return val;
}