Un po 'tardi per questo partito, ma tutti coloro che potrebbero essere interessati anche possibile utilizzare std::tuple
e un modello std::for_each
-come che scorre su una tupla.
Questo è basato sulla risposta di ingomueller.net in questa discussione.
ho avuto un caso recente in cui ho creato una mappa delle proprietà (la lettura di valori di configurazione, i tipi principalmente fondamentali, da un file XML e inserendoli in un std::unordered_map
, dove il tipo di valore è di tipo any
. Per scopi di debugging che volevo essere in grado di stampare l'intera mappa con le sue chiavi e valori insieme con il tipo di valore.
In quel progetto non sto usando Boost a tutti, ho usato il mio any
implementazione, ma è molto simile per amplificare :: any.
L'operatore di inserimento è praticamente il seguente:
template <typename TChar>
inline std::basic_ostream<TChar>&
operator<< (std::basic_ostream<TChar>& os, const sl::common::any& v)
{
// Types that we support with sl::common::any.
std::tuple<
float, double, bool,
int8_t, uint8_t,
int16_t, uint16_t,
int32_t, uint32_t,
int64_t, uint64_t,
std::wstring, const wchar_t*,
StreamInserter::UnsupportedType> t;
// Prepare ostream for printing a value of type any
StreamInserter si(os, v);
// Iterate over all types in tuple t. If the last type(UnsupportedType) is
// reached, given v is unsupported.
for_each(t, si);
return os;
}
Il template for_each si presenta così (C++ 14):
template <typename Tuple, typename F, std::size_t ...Indices>
constexpr void for_each_impl(Tuple&& tuple, F&& f, std::index_sequence<Indices...>) {
using swallow = int[];
(void)swallow{1,
(f(std::get<Indices>(std::forward<Tuple>(tuple))), void(), int{})...
};
}
template <typename Tuple, typename F>
constexpr void for_each(Tuple&& tuple, F&& f) {
constexpr std::size_t N = std::tuple_size<std::remove_reference_t<Tuple>>::value;
for_each_impl(std::forward<Tuple>(tuple), std::forward<F>(f),
std::make_index_sequence<N>{});
}
Con questo basta usare la classe StreamInserter
o qualcosa di simile mostrato in OING risposta.
Spero che questo aiuti.
Non puoi usare 'boost :: variant'? Questo sarebbe il metodo più semplice - qualcosa come "any" sembra solo semplice all'inizio. –
Bene, alcuni codici esterni hanno prodotto questa mappa per me. Forse posso convertirlo in 'map' in qualche modo? –
Frank
Penso che provenga da Boost.PO? Hai il controllo sulla fonte usando Boost.PO? –