#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHVwbGU+CgovLyDjg4bjg7Pjg5fjg6zjg7zjg4jlvJXmlbDjgYznhKHjgYTjgajjgY3jga7jg4Djg5/jg7zplqLmlbAKc3RkOjp0dXBsZTw+IEdldERlc2VyaWFsaXplZFZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiBkYXRhKSB7cmV0dXJuIHN0ZDo6dHVwbGU8PigpO30KCi8vIOWkieaVsOOCkuS4gOOBpOOBmuOBpOW+qeWFg+OBmeOCi+mWouaVsAp0ZW1wbGF0ZTxjbGFzcyBGaXJzdCwgY2xhc3MuLi4gUmVzdD4Kc3RkOjp0dXBsZTxGaXJzdCwgUmVzdC4uLj4gR2V0RGVzZXJpYWxpemVkVmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIGRhdGEpCnsKICAgIHN0ZDo6c3RyaW5nIGJ1ZmZlcihkYXRhKTsKICAgIGNvbnN0IEZpcnN0JiB2YWx1ZSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IEZpcnN0Kj4oYnVmZmVyLmRhdGEoKSk7CiAgICBidWZmZXIuZXJhc2Uoc2l6ZW9mKEZpcnN0KSk7CiAgICAKICAgIC8vIOW+jOe2muOBmeOCi+ODhuODs+ODl+ODrOODvOODiOW8leaVsOOCkuS9v+OBo+OBpuWGjeW4sOWRvOOBs+WHuuOBl+OCkuOBl+OBpuOAgee1kOaenOOBruOCv+ODl+ODq+OCkumAo+e1kOOBmeOCiwogICAgcmV0dXJuIHN0ZDo6dHVwbGVfY2F0KHN0ZDo6dHVwbGU8Rmlyc3Q+KHZhbHVlKSwgR2V0RGVzZXJpYWxpemVkVmFsdWU8UmVzdC4uLj4oYnVmZmVyKSk7Cn0KCi8vIOODkOODg+ODleOCoeOBi+OCieWkieaVsOOCkuW+qeWFg+OBl+OAgeOCv+ODl+ODq+OBp+i/lOOBmemWouaVsAp0ZW1wbGF0ZTxjbGFzcy4uLiBUeXBlcz4Kc3RkOjp0dXBsZTxUeXBlcy4uLj4gRGVzZXJpYWxpemUoY29uc3Qgc3RkOjpzdHJpbmcmIGRhdGEpCnsKICAgIHJldHVybiBHZXREZXNlcmlhbGl6ZWRWYWx1ZTxUeXBlcy4uLj4oZGF0YSk7Cn0KCmludCBtYWluKCkgewoJRGVzZXJpYWxpemU8aW50LCBkb3VibGU+KCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIik7CglyZXR1cm4gMDsKfQ==
prog.cpp: In function 'std::tuple<_Head, _Tail ...> GetDeserializedValue(const std::string&) [with First = double, Rest = {}, std::string = std::basic_string<char>]':
prog.cpp:16:90: instantiated from 'std::tuple<_Head, _Tail ...> GetDeserializedValue(const std::string&) [with First = int, Rest = {double}, std::string = std::basic_string<char>]'
prog.cpp:23:47: instantiated from 'std::tuple<_Elements ...> Deserialize(const std::string&) [with Types = {int, double}, std::string = std::basic_string<char>]'
prog.cpp:27:66: instantiated from here
prog.cpp:16:90: error: no matching function for call to 'GetDeserializedValue(std::string&)'