我有:
struct spacer : foo<bar>{};
struct sequence : baz<qux, spacer, quz, spacer, plugh>{};
我希望能夠寫(像這樣,確切的語法無關緊要):
struct spaced_sequence : SPACED_BAZ<qux, quz, plugh>{};
這可以用宏/模板/其他任何東西來完成嗎?
uj5u.com熱心網友回復:
您可以執行以下操作:
創建一個基本案例函式模板,將單個型別附加T到某些特化baz
template<typename T, typename ... Args>
auto append(baz<Args...>) -> baz<Args..., T>;
注意spacer這里沒有添加,因為T是我們添加的最后一個型別。
然后撰寫一個遞回案例,也作為函式模板,如果至少還有 2 個型別T1,則呼叫該案例,并且T2需要添加
template<typename T1, typename T2, typename ...Rest, typename ... Args>
auto append(baz<Args...>)
-> decltype(append<T2, Rest...>(std::declval<baz<Args..., T1, spacer>>()));
// insert spacer after T1 ^
// ^ pass the remaining types recursively
最后添加一個方便的別名
template<typename ...Ts>
using SPACED_BAZ = decltype(append<Ts...>(std::declval<baz<>>()));
// types to add ^ and baz is empty to start
這是一個演示。
uj5u.com熱心網友回復:
你可以做這樣的事情(假設知道引數的數量):
template <class T1, class T2, class T3>
using SPACED_BAZ = baz<T1, spacer, T2, spacer, T3>;
如果你有更多型別,你可以根據需要做其他別名。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/415743.html
標籤:
