Я хотел бы иметь такой класс:
template<typename T>
struct Foo {
T* data_;
template<typename... Ts, std::enable_if<std::is_same<T,Ts>...>...>
explicit Foo(Ts...ts) : data_{ ts... } {}
};
Тем не менее, что-то с синтаксисом неверно, и я не уверен, что вы можете установить параметры в указатель напрямую, как это при инициализации.
Я бы хотел, чтобы это было просто так:
Foo<int> f1{ 1, 3, 5, 7 }; // Or
// Foo<int> f1( 1, 3, 5 7 );
// f1.data_[0] = 1
// f1.data_[1] = 3
// f1.data_[2] = 5
// f1.data_[3] = 7
// f1.data_[4] = ... not our memory either garbage or undefined...
Foo<float> f2{ 3.5f, 7.2f, 9.8f }; // Or
// Foo<float> f2( 3.5f, 7.2f, 9.8f );
// f2.data_[0] = 3.5
// f2.data_[1] = 7.2
// f2.data_[2] = 9.8
// f2.data_[3] = ... not our memory
Я также хотел бы проверить конструктор, чтобы убедиться, что каждый передаваемый в конструктор параметр имеет тип <T>
; Проще говоря, для каждого Ts
это должно быть T
.
Возможно, я переосмысливаю это, но за свою жизнь я не могу получить это или что-то похожее на компиляцию. Я не знаю, находится ли он внутри enable_if
, is_same
или через список инициализаторов класса и пытается сохранить содержимое в указателе. Я не знаю, должен ли я вместо этого использовать массив T
, но размер массива не будет известен, пока аргументы не будут переданы в конструктор. Я также пытаюсь сделать это без использования основного контейнера, такого как std::vector
; это больше для самообразования, чем для практического исходного кода. Я просто хочу посмотреть, как это можно сделать с помощью необработанных указателей.
Редактировать
Я изменил свой класс на что-то вроде этого:
template<typename T>
struct Foo {
T* data_;
template<typename... Ts, std::enable_if_t<std::is_same<T, Ts...>::value>* = nullptr>
explicit Foo( const Ts&&... ts ) : data_{ std::move(ts)... } {}
};
И при попытке его использовать:
int a = 1, b = 3, c = 5, d = 7;
Foo<int> f1( a, b, c, d );
Foo<int> f2{ a, b, c, d };
Я немного ближе к этой итерации; но они оба дают разные ошибки компилятора.
- Первое из них:
C2661
: "Никакая перегруженная функция не принимает 4 аргумента"
- И второе:
C2440
: "инициализация, невозможно преобразовать список инициализатора в контейнер, ни один конструктор не может принять тип источника, или разрешение перегрузки конструктора было неоднозначным."