给出以下代码:
void foo(int x, int y, int z, int u)
{
}
template<typename... Args> class A;
template<> class A<>{};
template<typename T, typename... Args>
class A<T, Args...> : public A<Args...>
{
public:
A(){}
A(T a, Args... v) : m(a), A<Args...>(v...)
{
}
void call()
{
foo(m, A<V>::m...);
}
private:
T m;
};
A<int, int, int> a{1, 2, 3};
a.call();
如何解压函数 foo 中的模板变量参数,如下所示?
foo(m, A<int, int>::m, A<int>::m);
但是上面的代码将参数解包为:
foo(m, A<int>::m, A<int>::m);
call
函数中的模板参数,其次,您应该确保模板参数包
Args
在整个代码中一致使用。
这是代码的更正版本:
#include <iostream>
void foo(int x, int y, int z, int u)
{
std::cout << x << " " << y << " " << z << " " << u << std::endl;
}
template <typename... Args>
class A;
template <>
class A<> {};
template <typename T, typename... Args>
class A<T, Args...> : public A<Args...>
{
public:
A() {}
A(T a, Args... v) : m(a), A<Args...>(v...) {}
void call()
{
foo(m, static_cast<A<Args...>*>(this)->m...);
}
private:
T m;
};
int main()
{
A<int, int, int> a{1, 2, 3};
a.call();
return 0;
}
所做的更改:
static_cast
从
m
函数的基类
call
访问成员
(A<Args...>)
。
#include <iostream>
以在
std::cout
函数中使用
foo
。
foo
函数中的模板变量参数,如下所示:
foo(m, A<int, int>::m, A<int>::m);
这确保了 A
类的每个实例化都以正确的顺序将其成员
m
贡献给
foo
函数的参数列表。我希望这对你有帮助。