興味深い記事を見つけて、そのコードを MSVS 2017 で試してみました。
#include <utility>
#include <tuple>
template <typename... Args, typename Func, std::size_t... Idx>
void for_each(const std::tuple<Args...>& t, Func&& f, std::index_sequence<Idx...>) {
f(std::get<Idx>(t))...;
}
template <typename... Args, typename Func>
void for_each(const std::tuple<Args...>& t, Func&& f) {
for_each(t, f, std::index_sequence_for<Args...>{});
}
template <typename T>
void Write(std::wostream & out, const T & t)
{
out << t;
}
template<typename ...Args>
void WriteV(std::wostream & out, Args&... args)
{
for_each(std::tuple<Args&...>(args...), [&out](auto& a) { Write(out, a); });
}
struct A
{
int n;
std::wstring s;
double d;
};
void main()
{
std::wostringstream out;
A a{ 1, std::wstring(L"2"), 3.0 };
WriteV(a.n, a.s, a.d);
}
、しかしコードはエラーでコンパイルされませんでした:
error C2760: syntax error: unexpected token '...', expected ';'
error C3520: 'Idx': parameter pack must be expanded in this context
VS2017 が折り畳み式を完全にサポートしていないということですか?