簡體   English   中英

如何迭代可變參數模板類型的數量

[英]How to Iterate over number of variadic template Types

我目前正在學習 C++,我目前正在構建一個非常簡單的實體組件系統。 為此,我有一個 Function 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>()
                );
    }

從 C++ 17 開始,您可以使用折疊表達式:

template<typename... T>
return Signature((((unsigned long long int)1) << getComponentType<T>() | ...)); 

unsigned long long int 強制轉換似乎有點奇怪,但我將其與問題相同以澄清折疊表達式的使用:

(statement | ...)

我相信可變參數模板是 go 的方式。 類似的東西

template <typename T, typename ...Args>
Signature createSignature(T t, Args...)
{
    return Signature(((unsigned long long int)1)<<getComponentType<T>()) | createSignature(Args...);
}

template<typename T>
Signature createSignature(T t)
{
    return Signature(((unsigned long long int)1)<<getComponentType<T>());
}

暫無
暫無

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

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