簡體   English   中英

std::any_cast 獲取未命名的枚舉?

[英]std::any_cast to get an unnamed enum?

在我知道任何類型之前,我有一個 std::anys 隊列,我正在嘗試將任何未命名的枚舉強制轉換為整數,同時填充它。

假設我有以下代碼:

enum {
    VALUE_1,
    VALUE_2,
};

enum {
    VALUE_3
};

template<typename ...T>
std::queue<std::any> extract_variadic_to_queue_impl(const T&... args) {
    std::vector<std::any> vec = { args ... };
    std::queue<std::any> ret;
    for (unsigned int i = 0, max = vec.size(); i < max; i++) {
        std::string type_name = vec[i].type().name();
        if (type_name.starts_with("enum <unnamed-enum>")) {
            ret.push((int)std::any_cast<???>(vec[i]));
        }
        else {
            ret.push(vec[i]);
        }
    }
    return ret;
}

template<typename ...T>
std::queue<std::any> extract_variadic_to_queue(T... args) {
     return extract_variadic_to_queue_impl(std::any(args)...);
}

#define EXTRACT(var_name, type) type var_name = std::any_cast<type>(q.front()); q.pop();

void test() {
    std::queue<std::any> q = extract_variadic_to_queue(
        0, 
        "hi", 
        VALUE_2, 
        2.0f, 
        2.0
    );
    EXTRACT(my_int, int);
    EXTRACT(my_string, const char*);
    EXTRACT(my_constant, int);
    EXTRACT(my_float, float);
    EXTRACT(my_double, double);
}

我知道對於所有未命名的枚舉,type_name 將評估為“enum <unnamed-enum>-”,后跟第一個值的名稱(在這種情況下,“enum <unnamed-enum>-VALUE_1”)。 假設我不能只命名枚舉,我需要替換什么??? 為了使這項工作? 我知道它不是 int 因為EXTRACT(my_constant, int); 如果我不檢查extract_variadic_to_queue_impl中的未命名枚舉,則會拋出bad_any_cast ,但我認為必須有某種方法來獲取該值,否則它根本不會讓我存儲它,對吧?

此外,如果將test()更改為:


void test() {
    std::queue<std::any> q = extract_variadic_to_queue(
        0,
        "hi", 
        VALUE_2, 
        2.0f, 
        2.0, 
        VALUE_3 //now passes values from two different enums
    );
    EXTRACT(my_int, int);
    EXTRACT(my_string, const char*);
    EXTRACT(my_constant, int);
    EXTRACT(my_float, float);
    EXTRACT(my_double, double);
    EXTRACT(my_other_constant, int);

}

謝謝!

您根本不應該使用type().name()來做出這樣的決定,而不是用於未命名的enum或任何其他類型。 這些名稱是完全由實現定義的。 無法保證它們將是什么(或它們將是唯一的)。

您應該使用std::any_cast或通過== -將type()typeid(/*type here*/)進行比較來檢查包含的類型。

要檢索存儲的類型,您必須以一種或另一種方式為該類型提供別名。 要么給enum命名,要么通過decltype從枚舉數(或其類型的變量)獲取類型。

暫無
暫無

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

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