вывести auto в конструкторе класса

101
16 марта 2021, 23:00

Я пытаюсь вывести тип поля класса в конструкторе следующим образом:

#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 нельзя, т.к. кортеж изменяемый.

Answer 1

Практически, вы пытаетесь определить тип члена data во время выполнения. Но размер типа должен быть известен во время компиляции, потому и во время компиляции должны быть известны типы его членов. Следовательно ваша попытка является ошибкой, тогда как вы смогли бы просто указать его конкретный тип. И, как замечание: метод incrementAll не имеет никаких аргументов и не является шаблонным, поэтому он не может знать какие аргументы принимает лямбда. Так что тут тоже вы изрядно все запутали

READ ALSO
Как правильно создать и вывести список?

Как правильно создать и вывести список?

Задание звучит так: Представить таблицу в виде линейного списка L, элементами которого являются строки таблицы: №, Фамилия, Оценки (Физика,...

90
Получить user data в Hook Proc

Получить user data в Hook Proc

Я имею класс следующего вида:

110
Что лучше цикл с условием или без него?

Что лучше цикл с условием или без него?

Обычно тело цикла выглядит как-то так:

82