Я пытаюсь вывести тип поля класса в конструкторе следующим образом:
#include <tuple>
template <size_t k>
struct A {
int val = k;
void increment() { val++; }
};
class Container {
auto data;
public:
Container() : data(std::make_tuple(A<1>{}, A<2>{}, A<3>{})){ }
void incrementAll() {
std::apply([](auto... args){ (args.increment(), ...); }, data);
}
};
int main() {
Container c;
c.incrementAll();
return 0;
}
при попытке скомпилировать это с помощью GCC 7.2.0 получаю ошибку вида:
error: non-static data member declared with placeholder auto
Инициальзировать поле data как constexpr static нельзя, т.к. кортеж изменяемый.
Практически, вы пытаетесь определить тип члена data во время выполнения. Но размер типа должен быть известен во время компиляции, потому и во время компиляции должны быть известны типы его членов. Следовательно ваша попытка является ошибкой, тогда как вы смогли бы просто указать его конкретный тип. И, как замечание: метод incrementAll не имеет никаких аргументов и не является шаблонным, поэтому он не может знать какие аргументы принимает лямбда. Так что тут тоже вы изрядно все запутали
Продвижение своими сайтами как стратегия роста и независимости