Variant我想用 C 創建某種東西。實際上我想盡可能少地使用模板。這個想法是將值union與變數的型別一起存盤并根據存盤的型別回傳值。
所以測驗代碼如下所示:
#include <iostream>
#include <vector>
#include <cstring>
#include <typeinfo>
#include <typeindex>
using namespace std;
constexpr uint64_t mix(char m, uint64_t s)
{
return ((s << 7) ~(s >> 3)) static_cast<uint64_t>(~m);
}
constexpr uint64_t _(const char* str)
{
return (*str) ? mix(*str,_(str 1)) : 0;
}
class Variant
{
public:
template<typename T>
Variant(T value):
m_info(typeid(value))
{
std::memcpy(&m_val, &value, sizeof(T));
}
auto toValue() ->decltype(???) // what have I use here ???
{
switch(_(m_info.name()))
{
case _("b"):
return m_val.bval;
case _("i"):
return m_val.ival;
case _("d"):
return m_val.dval;
break;
}
return 0;
}
char cval;
unsigned char ucval;
private:
union Types
{
bool bval;
int ival;
double dval;
} m_val;
std::type_index m_info;
};
用法:
int main()
{
std::vector<Variant> arr = { 1, 2.2, true };
for(auto &v: arr)
{
cout << "value is: " << v.toValue() << endl;
}
return 0;
}
但是decltype需要一個運算式作為引數,這就是我卡住的地方。我在這里使用了什么表達方式?
uj5u.com熱心網友回復:
根據@UnholySheep 的評論,您要做的是擁有一個在運行時推匯出回傳型別的函式,這根本不可能。回傳型別必須在編譯時知道。所以你將不得不改變你的API。這里有幾個不同的選項。
這似乎類似于std::variant,其 API 等效于您的toValue()外觀如下:
std::get<double>(variant)
std::get<int>(variant)
std::get<bool>(variant)
如果您嘗試獲取錯誤型別的值,此函式呼叫std::get將拋出。std::bad_variant_access你可以在這里做。
另一種選擇是從類中提取union { bool, int, double }型別,Variant以便您可以將其用作回傳型別。然后可能建議進行另一個函式呼叫,以便呼叫者可以在運行時判斷聯合實際上是哪種型別。您可以回傳一個列舉或為此回傳您的m_type變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/445338.html
