#include <iostream>
#include <tuple>

// テンプレート引数が無いときのダミー関数
std::tuple<> GetDeserializedValue(const std::string& data) {return std::tuple<>();}

// 変数を一つずつ復元する関数
template<class First, class... Rest>
std::tuple<First, Rest...> GetDeserializedValue(const std::string& data)
{
    std::string buffer(data);
    const First& value = *reinterpret_cast<const First*>(buffer.data());
    buffer.erase(sizeof(First));
    
    // 後続するテンプレート引数を使って再帰呼び出しをして、結果のタプルを連結する
    return std::tuple_cat(std::tuple<First>(value), GetDeserializedValue<Rest...>(buffer));
}

// バッファから変数を復元し、タプルで返す関数
template<class... Types>
std::tuple<Types...> Deserialize(const std::string& data)
{
    return GetDeserializedValue<Types...>(data);
}

int main() {
	Deserialize<int, double>("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
	return 0;
}