簡體   English   中英

在C ++中訪問參數包的內部變量

[英]Accessing inner variables of parameter pack in C++

有沒有簡單的方法可以訪問整個參數包的內部成員? 假設您有以下代碼

#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的成員變量並將其傳遞給打印機。 有沒有一種簡單的方法而又無需遍歷參數列表的方法?

清除代碼中的幾個問題后,我可以對其進行編譯:

  • AB應該是公開其定義的結構。
  • 轉發其靜態成員沒有任何意義,只是跳過轉發-轉發僅對“通用引用”有意義
  • 在gcc中,我不得不將單參數printer放在可變參數的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是靜態constexpr成員,因此您只需保留參數pack:

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

僅供參考,如果C是A和B的普通成員變量,則對std::forward的正確調用應如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM