我目前正在學習 C ,我目前正在構建一個非常簡單的物體組件系統。為此,我有一個函式 getComponentType,它將每個組件映射到一個 uint8_t。簽名只是一個 std::bitset
我想要這樣的方法。
Signature signature = createSignature<TransformComponent, GraphicsComp>();
假設 TransformComponent 被映射到 0,GraphicsComp 被映射到 1。簽名現在應該是一個 std::bitset {1100000...} 我知道如何使用非各種模板方法來做到這一點,現在的問題是我將如何存檔與各種模板型別相同,或者是否有更好的解決方案來做同樣的事情。
template <typename T> Signature createSignature(){
return Signature(((unsigned long long int)1)<<getComponentType<T>());
}
template <typename T, typename R> Signature createSignature(){
return Signature(
((unsigned long long int)1)<<getComponentType<T>() |
((unsigned long long int)1)<<getComponentType<R>()
);
}
template <typename T, typename R, typename S> Signature createSignature(){
return Signature(
((unsigned long long int)1)<<getComponentType<T>() |
((unsigned long long int)1)<<getComponentType<R>() |
((unsigned long long int)1)<<getComponentType<S>()
);
}
template <typename T, typename R, typename S, typename U> Signature createSignature(){
return Signature(
((unsigned long long int)1)<<getComponentType<T>() |
((unsigned long long int)1)<<getComponentType<R>() |
((unsigned long long int)1)<<getComponentType<S>() |
((unsigned long long int)1)<<getComponentType<U>()
);
}
uj5u.com熱心網友回復:
從 C 17 開始,您可以使用折疊運算式:
template<typename... T>
Signature createSignature()
{
Return Signature((((unsigned long long int)1) << getComponentType<T>() | ...));
}
unsigned long long int cast 看起來有點奇怪,但我把它與問題相同,以澄清 fold 運算式的使用:
(statement | ...)
最小版本看起來像這樣:
template<typename T>
unsigned long long int stuffFor();
template<typename... T>
unsigned long long int variadicFoldedStuff()
{
return (stuffFor<T>() | ...);
}
uj5u.com熱心網友回復:
我相信可變引數模板是通往這里的方式。類似的東西
template<typename T>
Signature createSignature(T t)
{
return Signature(((unsigned long long int)1)<<getComponentType<T>());
}
template <typename T, typename ...Args>
Signature createSignature(T t, Args ...args)
{
return Signature(((unsigned long long int)1)<<getComponentType<T>()) | createSignature(args...);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/402506.html
標籤:
下一篇:C 無法實體化模板類
