[英]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.