C++ 可变参数模板解包

问题描述 投票:0回答:1

给出以下代码:

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);
    
c++11 variadic-templates argument-unpacking
1个回答
0
投票
您的代码中似乎有几个问题需要解决。首先,您必须正确解包

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; }

所做的更改:

    使用
  1. static_cast
    m
     函数的基类 
    call
     访问成员 
    (A<Args...>)
  2. 添加
  3. #include <iostream>
    以在
    std::cout
    函数中使用
    foo
通过这些更改,代码现在应该正确解压

foo

 函数中的模板变量参数,如下所示:

foo(m, A<int, int>::m, A<int>::m);
这确保了 

A

 类的每个实例化都以正确的顺序将其成员 
m
 贡献给 
foo
 函数的参数列表。我希望这对你有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.