可变参数模板中对象的调用函数
Call function of objects in a Variadic Template
我有一个可以容纳不同数据类型的模板对象,以及一个名为 get()
的方法。 get()
returns 转换为 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);
你很接近!这是一种非递归方式,免费提供完美转发:
template <class... As>
int getStuff(As&&... as)
{
int val = 0;
for(int i : {std::forward<As>(as).get()...})
val += i;
return val;
}
我有一个可以容纳不同数据类型的模板对象,以及一个名为 get()
的方法。 get()
returns 转换为 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);
你很接近!这是一种非递归方式,免费提供完美转发:
template <class... As>
int getStuff(As&&... as)
{
int val = 0;
for(int i : {std::forward<As>(as).get()...})
val += i;
return val;
}