是否可以將一些 void* 指標放入具有運行時生成的索引的變體中。
這個不錯的解決方案(來自此處鏈接)是否可以更新以獲取索引和指向 emplace 的指標?
#include <variant>
template <typename... Ts, std::size_t... Is>
void next(std::variant<Ts...>& v, std::index_sequence<Is...>)
{
using Func = void (*)(std::variant<Ts...>&);
Func funcs[] = {
[](std::variant<Ts...>& v){ v.template emplace<(Is 1) % sizeof...(Is)>(); }...
};
funcs[v.index()](v);
}
template <typename... Ts>
void next(std::variant<Ts...>& v)
{
next(v, std::make_index_sequence<sizeof...(Ts)>());
}
可以獲得所需的資料型別是可能的,但無論如何不要認為它有幫助
Func funcs[] = {
[](MessageTypesVariant& v) {
auto y = std::get<(Is)>(v);
auto z = std::forward<decltype(y)>(y);
v.template emplace<(Is)>(); }...
};
uj5u.com熱心網友回復:
你可以這樣做,解壓Ts...并檢查型別是否匹配。
template <typename T, typename... Ts>
bool set(std::variant<Ts*...>& v, int typeIndex, void* ptrToData) {
constexpr static auto idx = index_v<T, Ts...>;
if (idx == typeIndex) {
v.template emplace<idx>(static_cast<T*>(ptrToData));
return true;
}
return false;
}
template <typename... Ts>
void set(std::variant<Ts*...>& v, int typeIndex, void* ptrToData) {
(set<Ts, Ts...>(v, typeIndex, ptrToData) || ...);
}
在這里,您需要一種從型別串列中索引型別的方法,這是型別串列中 index_v使用的一種常用技術。
// index
inline constexpr std::size_t npos = -1;
template <typename T, typename... Ts>
struct index : std::integral_constant<std::size_t, npos> {};
template <typename T, typename... Ts>
inline constexpr std::size_t index_v = index<T, Ts...>::value;
template <typename T, typename... Ts>
struct index<T, T, Ts...> : std::integral_constant<std::size_t, 0> {};
template <typename T, typename Head, typename... Tail>
class index<T, Head, Tail...> {
static constexpr std::size_t tmp = index_v<T, Tail...>;
public:
static constexpr std::size_t value = tmp == npos ? tmp : tmp 1;
};
演示
uj5u.com熱心網友回復:
您可以將提供的代碼改編為:
template <typename... Ts, std::size_t... Is>
void set(std::variant<Ts...>& v, std::index_sequence<Is...>, std::size_t index, void* data)
{
using Func = void (*)(std::variant<Ts...>&, void*);
Func funcs[] = {
[](std::variant<Ts...>& v, void* data){
using T = std::variant_alternative_t<Is, std::variant<Ts...>>;
v.template emplace<Is>(*reinterpret_cast<T*>(data));
}...
};
funcs[index](v, data);
}
template <typename... Ts>
void set(std::variant<Ts...>& v, std::size_t index, void* data)
{
set(v, std::make_index_sequence<sizeof...(Ts)>(), index, data);
}
演示
請注意,盡管您的界面很脆弱:data應該是正確的型別,否則您有 UB。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/537517.html
標籤:C 模板标准变体
