我今天一直在制作序列化程式,但無法讓它與變體一起使用。
我之前已經將這個程序用于其他各種事情,我一直在修剪型別,直到找到我需要的一種型別。不過,這次VC 好像推不出來了。
這是錯誤的完整示例。
#include <type_traits>
#include <variant>
#include <iostream>
#include <sstream>
void serialize( auto& s, float v ) {
std::cout << "serialize float";
}
void serialize( auto& s, int v ) {
std::cout << "serialize int";
}
void serialize( auto& s, bool v ) {
std::cout << "serialize bool";
}
namespace detail
{
template<typename VariantT, typename T1, typename ...Rest>
void serialize_variant( auto& s, const VariantT& v ) {
if ( std::holds_alternative<T1>( v ) )
return serialize( s, std::get<T1>( v ) );
else if ( sizeof...(Rest) >= 1 )
return serialize_variant<VariantT, Rest...>( s, v );
else return;
}
}
template<typename ...VariantTs>
void serialize( auto& s, const std::variant<VariantTs...>& v ) {
detail::serialize_variant<std::variant<VariantTs...>, VariantTs...>( s, v );
}
int main() {
std::stringstream s{};
std::variant<float, int, bool> x = true;
serialize( s, x );
}
我很困惑為什么這不起作用。它應該檢查 T1 是否是變體包含的型別。如果不是,則檢查是否有更多型別要檢查,并在有時呼叫相同的 serialize_variant 函式,但型別少一種,否則就回傳。它在遞回呼叫中為 serialize_variant 拋出一個不匹配的多載,它說它不能推斷 T1。
任何人都可以解釋為什么這無法編譯嗎?
這是我得到的以下錯誤
Error C2672 'serialize_variant': no matching overloaded function found
Error C2783 'void detail::serialize_variant(_T0 &,const VariantT &)': could not deduce
template argument for 'T1'
謝謝。
uj5u.com熱心網友回復:
當條件為 時,帶有的分支sizeof...(Rest) >= 1也必須有效false,但不是。false當條件為via時,您可以將其丟棄if constexpr。此外,您試圖回傳一些東西,但回傳型別是void.
namespace detail
{
template<typename VariantT, typename T1, typename ...Rest>
void serialize_variant( auto& s, const VariantT& v ) {
if ( std::holds_alternative<T1>( v ) )
/*return*/ serialize( s, std::get<T1>( v ) );
else {
if constexpr ( sizeof...(Rest) >= 1 )
/*return*/ serialize_variant<VariantT, Rest...>( s, v );
else return;
}
}
}
完整示例
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/415740.html
標籤:
