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の前に1 つの引数を配置する必要がありました

プロキシは次のようになります。

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

Cstatic 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 に答える