簡體   English   中英

C++ 17:如何使用參數包來明確function中參數的順序,都是相同的類型

[英]C++ 17: How to use parameter packs to clarify the order of parameters in a function which all have the same type

我正在使用 C++ 17 並希望使用模板參數來指定 function arguments 的順序,它們都具有相同的類型。 function 有不同數量的 arguments,這些 arguments 的排序也不同。

我嘗試使用以下(簡化的)代碼來使用參數包來實現它。

  • 結構TheInner是用於所有 function arguments 的類型。
  • Outer結構用於指定傳遞給 function 的參數的順序。
// In .h file
struct TheInner {};
 
template<typename T> struct Outer
{
  using Inner = T;
};

struct OuterA : Outer<TheInner> {};
struct OuterB : Outer<TheInner> {};

template<class... Outers> void Method(Outers::Inner... inners);
template<> void Method<OuterA, OuterA, OuterB>(TheInner a, TheInner a2, TheInner b);
template<> void Method<OuterA, OuterB, OuterA>(TheInner a, TheInner b, TheInner a2);

// In .cpp file
template<> void Method<OuterA, OuterA, OuterB>(TheInner a, TheInner a2, TheInner b)
{
  ...
}

template<> void Method<OuterA, OuterB, OuterA>(TheInner a, TheInner b, TheInner a2)
{
  ...
}

int main(int argc, char** argv)
{
  Method<OuterA, OuterB, OuterA>(TheInner(), TheInner(), TheInner());
}

目前,這會導致 GCC 出現以下錯誤消息:

main.cpp:15:32: error: variable or field 'Method' declared void
   15 | template<class... Outers> void Method(Outers::Inner... inners);
      |                                ^~~~~~
main.cpp:15:55: error: expected ')' before 'inners'
   15 | template<class... Outers> void Method(Outers::Inner... inners);
      |                                      ~                ^~~~~~~
      |                                                       )
main.cpp:17:23: error: expected initializer before '<' token
   17 | template<> void Method<OuterA, OuterA, OuterB>(TheInner a, TheInner a2, TheInner b)
      |                       ^

我現在發現(幾個小時后)我只是在Outers::Inner類型之前缺少一個typename關鍵字。

下面附上功能代碼,希望對以后的人有所幫助:

// Example program
// In .hpp file
#include <iostream>
#include <string>

struct TheInner {};

template<typename T> struct Outer
{
    using Inner = T;
};

struct OuterA : Outer<TheInner> {};
struct OuterB : Outer<TheInner> {};

template<class... Outers> void Method(typename Outers::Inner... inners);
template<> void Method<OuterA, OuterA, OuterB>(TheInner a, TheInner a2, TheInner b);
template<> void Method<OuterA, OuterB, OuterA>(TheInner a, TheInner b, TheInner a2);

// In .cpp file
// #include <iostream>
// #include <string>

template<> void Method<OuterA, OuterA, OuterB>(TheInner a, TheInner a2, TheInner b)
{
    std::cout << "A" << std::endl;
}

template<> void Method<OuterA, OuterB, OuterA>(TheInner a, TheInner b, TheInner a2)
{
    std::cout << "B" << std::endl;
}

int main()
{
    Method<OuterA, OuterB, OuterA>(TheInner(), TheInner(), TheInner()); // Prints B
    Method<OuterA, OuterA, OuterB>(TheInner(), TheInner(), TheInner()); // Prints A

    // Unimplemented methods:

    // error: too many arguments to function 'void Method(typename Outers::Inner ...) [with Outers = {OuterA, OuterA}]'
    // Method<OuterA, OuterA>(TheInner(), TheInner(), TheInner());

    // undefined reference to `void Method<OuterA, OuterA>(OuterA::Inner, OuterA::Inner)'
    // Method<OuterA, OuterA>(TheInner(), TheInner());
}

程序的output為:

B
A

暫無
暫無

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

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