是否可以提取區分聯合的類型來初始化一個「自動」變量?很簡單,你將類型傳遞給模板,但我想要一些「自動」的東西。使用訪問者函數或使用有界列表類型(如mpl :: vector)的解決方案會很好。是否有可能自動從歧視聯盟中提取類型?
一個示例如下所示:
#include <iostream>
#include <typeindex>
#include <cassert>
struct d_union {
template <typename T>
d_union(T t) {
*reinterpret_cast<T*>(data) = t;
_type_id = &typeid(T);
}
template <typename T>
const T* get_pointer() const {
if (_type_id == &typeid(T))
return reinterpret_cast<const T*>(data);
else
return nullptr;
}
template <typename T>
const T get() const {
assert (_type_id == &typeid(T));
return *get_pointer<T>();
}
alignas(8) char data[8];
const std::type_info *_type_id;
};
std::ostream& operator<<(std::ostream&os, const d_union &u) {
if (auto ip = u.get_pointer<int>())
os << *ip;
if (auto fp = u.get_pointer<float>())
os << *fp;
return os;
}
int main() {
d_union _i = d_union(42);
d_union _f = d_union(3.14f);
std::cout << "d_union(42) = " << _i << std::endl;
std::cout << "d_union(3.14) = " << _f << std::endl;
int _get_i = _i.get<int>();
std::cout << "d_union(42).get<int>() = " << _get_i << std::endl;
// auto _get_auto = _i.get();
// std::cout << "d_union(42).get()" << _get_auto << std::endl;
}
在任何可能的解決方案,將不勝感激!
感謝
在C++中沒有辦法做到這一點。您在get操作中將內存區域的類型指定爲特定類型,而無法從類中知道類型中實際存儲的內容。 auto如何「知道」該類型正在返回?類型的模板「列表」可能是這些庫使用的內容,但這仍然涉及從列表中選擇您想要返回的類型,即列表會讓你獲得char並返回它。真的沒什麼改進。 –
ceorron
此代碼違反了嚴格的別名規則('char'可能不會被別名爲'T');解決這個問題'alignas(8)char data [8];''aligned_storage <8,8> data;' –