1

是否有任何简单的方法可以访问整个参数包的内部成员?假设您有以下代码

#include <iostream>

class A {
    typedef int type;
    constexpr static type C = 5;
};

class B {
    typedef unsigned type;
    constexpr static type C = 6;
};

template <class T1, class ... TList>
std::ostream & printer(std::ostream & out, T1 t1, TList ... plist) {
    out << t1 << " ";
    return printer(out, plist...);
}

template <class T1>
std::ostream & printer(std::ostream & out, T1 t1) {
    return out << t1 << std::endl;
}

template <class ... TList>
std::ostream & proxy(std::ostream & out, TList ... plist) {
    return printer(out, std::forward<TList::type ...>(plist::C ...));
}

int main(int argc, const char * argv[])
{
    proxy(std::cout, A(), B());
    return 0;
}

我希望代理函数解压缩 plist 的成员变量并将它们传递给打印机。有没有一种简单的方法可以在不遍历参数列表的情况下做到这一点?

4

1 回答 1

2

在清除了您的代码的几个问题后,我可以编译它:

  • A并且B应该是公开其定义的结构。
  • 转发它们的静态成员没有意义,只需跳过转发 - 转发仅对“通用引用”有意义
  • 在 gcc 中,我必须将单参数放在可变参数printer之前

代理现在看起来像这样:

template <class ... TList>
std::ostream & proxy(std::ostream & out, TList ... plist) {
  //leave the forward, plist is a variable pack, so operator.
  return printer(out, plist.C ...);  

  //or:
  return printer(out, TList::C...); 
}

由于C's 是静态 constexpr 成员,因此您可以保留参数包:

template <class ... TList>
std::ostream & proxy(std::ostream & out) {
    return printer(out, TList::C ...);  
}

int main(int argc, const char * argv[])
{
    proxy<A,B>(std::cout);
    return 0;
}

仅供参考,如果是 A 和 B 的普通成员变量,正确的调用std::forward应该是这样的:C

template <class ... TList>
std::ostream & proxy(std::ostream & out, TList&& ... plist) {
    return printer(out, std::forward<typename TList::type>(plist.C)...);
}
于 2013-06-11T10:10:42.213 回答