Рассмотрим следующий код:
#include <iostream>
#include <utility>
#include <array>
#include <functional>
#include <ctime>
template <unsigned N> void foo() { std::cout << N << "(" << ") "; }
template<> void foo<2>() { std::cout << "TWO (" << ") "; }
struct Foo {
template <unsigned N> void operator()(std::integral_constant<unsigned,N>) { foo<N>(); }
};
template <std::size_t Offset, std::size_t... Idx, typename F>
void visit(F f, std::index_sequence<Idx...>, std::size_t n) {
static std::array<std::function<void()>, sizeof...(Idx)> funcs {{
[&f](){f(std::integral_constant<unsigned,Idx+Offset>{});}...
}};
funcs[n - Offset]();
};
template <std::size_t Start, std::size_t End, typename F>
void visit(F f, std::size_t n) {
visit<Start>(f, std::make_index_sequence<End-Start>{}, n);
};
int main() {
auto t = time(nullptr);
for(int i = 0; i < 10; i++) {
visit<1, 10>(Foo{}, (t+i) % 10);
}
}
Это допустимый C ++ 14 (фактически, также допустимый C ++ 11, если вы пишете свой собственный std::index_sequence
). Но - он не компилируется с g ++ 6.x и 7.x; только g ++ 8.x компилирует его правильно (см. это на GodBolt ).
По организационным причинам я могу потребовать использовать версию g ++ до 7.2. Есть ли способ, которым я мог бы изменить код, сохраняя семантику, чтобы g ++ 7.x скомпилировал его?