Задать вопрос
  • Почему возникает ошибка C2512 в конструкторе с std::initializer_list?

    @communistic_sistema Автор вопроса
    Wataru, а без вариадического шаблона нельзя? То есть отказаться от std::initializer_list?
    Написано
  • Почему возникает ошибка C2512 в конструкторе с std::initializer_list?

    @communistic_sistema Автор вопроса
    Wataru, приведу на всякий случай структуру целиком:
    template<typename T, size_t N>
    requires (N > 0)
    struct static_array {
    	using type = T;
    	using const_type = const type;
    	using pointer = type*;
    	using const_pointer = const_type*;
    	type arr[N];
    	static_array() noexcept(std::is_nothrow_default_constructible_v<type>)
    	requires std::is_default_constructible_v<type> {
    
    	}
    
    	static_array(std::initializer_list<type> il)
    	requires std::is_copy_constructible_v<type> : arr(std::forward<std::initializer_list<type>>(il)) {
    		if (il.size() != N) {
    			throw invalid_range();
    		}
    	}
    	static_array(const static_array& other) noexcept(std::is_nothrow_copy_constructible_v<type>)
    	requires std::is_copy_constructible_v<type> : arr(other.arr) {
    
    	}
    	
    
    
    	pointer begin() noexcept {
    		return arr;
    	}
    	const_pointer begin() const noexcept {
    		return arr;
    	}
    	pointer end() noexcept {
    		return arr + N;
    	}
    	const_pointer end() const noexcept {
    		return arr + N;
    	}
    
    
    	static_array& operator=(const static_array& other) noexcept(std::is_nothrow_copy_assignable_v<type>)
    	requires std::is_copy_assignable_v<type> {
    		if (this == &other) {
    			return *this;
    		}
    		pointer iter = begin();
    		for (const_type& val : other) {
    			*iter = val;
    			++iter;
    		}
    		return *this;
    	}
    	template<typename U>
    	requires std::is_assignable_v<type, const U&>
    	static_array& operator=(const static_array<U, N>& other) noexcept(std::is_nothrow_assignable_v<type, const U&>) {
    		if (this == &other) {
    			return *this;
    		}
    		pointer iter = begin();
    		for (const U& val : other) {
    			*iter = val;
    			++iter;
    		}
    		return *this;
    	}
    	static_array& operator=(static_array&& other) noexcept
    	requires std::is_swappable_v<type> {
    		if (this == &other) {
    			return *this;
    		}
    		pointer iter = begin();
    		for (type& val : other) {
    			std::swap(*iter, val);
    			++iter;
    		}
    		return *this;
    	}
    
    
    	type& operator[](size_t index) {
    		if (!(index < N)) {
    			throw out_of_range();
    		}
    		return arr[index];
    	}
    	const_type& operator[](size_t index) const {
    		if (!(index < N)) {
    			throw out_of_range();
    		}
    		return arr[index];
    	}
    };

    использую я ее в другом месте version структуре, где она static_array, а именно:
    version(dte_utils::static_array<char, 4> value = {0,0,0,0});

    возникает та ошибка, где init list нельзя конвертировать в char
    все-таки без костылей с char[] хочется
    Написано
  • Почему возникает ошибка C2512 в конструкторе с std::initializer_list?

    @communistic_sistema Автор вопроса
    Wataru, я удалил place_at, вписал код комментом выше и это не решило проблему первым способом
    Написано
  • Почему возникает ошибка C2512 в конструкторе с std::initializer_list?

    @communistic_sistema Автор вопроса
    В случае
    static_array(std::initializer_list<type> il)
    requires std::is_copy_constructible_v<type>  : arr(std::forward<std::initializer_list<type>>(il))
    возникает ошибка:
    1>C:\Users\User\Desktop\DynamicTokenEngine\DTE\Utility\memory\static_array.hpp(31,95): error C2440: инициализация: невозможно преобразовать "_Ty" в "char"
    1>C:\Users\User\Desktop\DynamicTokenEngine\DTE\Utility\memory\static_array.hpp(31,95): error C2440: with
    1>C:\Users\User\Desktop\DynamicTokenEngine\DTE\Utility\memory\static_array.hpp(31,95): error C2440: [
    1>C:\Users\User\Desktop\DynamicTokenEngine\DTE\Utility\memory\static_array.hpp(31,95): error C2440: _Ty=std::initializer_list
    1>C:\Users\User\Desktop\DynamicTokenEngine\DTE\Utility\memory\static_array.hpp(31,95): error C2440: ]
    1>(компиляция исходного файла "module/version.cpp")
    1> C:\Users\User\Desktop\DynamicTokenEngine\DTE\Utility\memory\static_array.hpp(31,95):
    1> Для выполнения данного преобразования нет доступного оператора преобразования, определенного пользователем, или вызов оператора невозможен
    1> C:\Users\User\Desktop\DynamicTokenEngine\DTE\Utility\memory\static_array.hpp(31,95):
    1> контекст создания экземпляра шаблона (сначала самый старый)
    1> C:\Users\User\Desktop\DynamicTokenEngine\DTE\TokenOperator\module\version.hpp(6,37):
    1> выполняется компиляция ссылки на экземпляр класс шаблон функции "dte_utils::static_array"
    1> C:\Users\User\Desktop\DynamicTokenEngine\DTE\Utility\memory\static_array.hpp(30,3):
    1> во время компиляции функции-члена класс шаблон "dte_utils::static_array::static_array(std::initializer_list)"
    1> C:\Users\User\Desktop\DynamicTokenEngine\DTE\TokenOperator\module\version.cpp(4,73):
    1> см. первую ссылку на "dte_utils::static_array::static_array" в "dte_module::version::version"
    То есть в static_array, как я понимаю" проблема преобразования std::initializer_list в char, плюс в комментарии под вопросом я дал полный код структуры, я надеюсь, он понятен
    Вариант с char, мне нужно делать его alignas?
    Написано
  • Почему возникает ошибка C2512 в конструкторе с std::initializer_list?

    @communistic_sistema Автор вопроса
    jcmvbkbc, тогда как мне создать пространство для массива (не выделяя дин память) и не создавать по умолчанию их? Плюс почему ошибка указывает на конструктор, а не на arr?
    Написано
  • Почему возникает ошибка C2512 в конструкторе с std::initializer_list?

    @communistic_sistema Автор вопроса
    Евгений Шатунов, у меня не транслятор ошибку пишет, а компилятор.
    #include <initializer_list>
    namespace dte_utils {
    	template<typename T, size_t N>
    	requires (N > 0)
    	struct static_array {
    		using type = T;
    		using const_type = const type;
    		using pointer = type*;
    		using const_pointer = const_type*;
    		type arr[N];
    		static_array() noexcept(std::is_nothrow_default_constructible_v<type>)
    		requires std::is_default_constructible_v<type> {
    			pointer iter = end();
    			while (iter != begin()) {
    				place_at(--iter);
    			}
    		}
    		template<typename U>
    		requires std::is_constructible_v<type, const U&>
    		static_array(const U (&arr)[N]) noexcept(std::is_nothrow_constructible_v<type, const U&>) {
    			pointer iter = begin();
    			for (const U& val : arr) {
    				place_at(iter, val);
    				++iter;
    			}
    		}
    		static_array(std::initializer_list<type> il)
    		requires std::is_copy_constructible_v<type> {
    			if (il.size() != N) {
    				throw invalid_range();
    			}
    			pointer iter = begin();
    			for (const_type& val : il) {
    				place_at(iter, val);
    				++iter;
    			}
    		}
    		static_array(const static_array& other) noexcept(std::is_nothrow_copy_constructible_v<type>)
    		requires std::is_copy_constructible_v<type> {
    			pointer iter = begin();
    			for (const_type& val : other) {
    				place_at(iter, val);
    				++iter;
    			}
    		}
    		template<typename U>
    		requires std::is_constructible_v<type, const U&>
    		static_array(const static_array<U, N> other) noexcept(std::is_nothrow_constructible_v<type, const U&>) {
    			pointer iter = begin();
    			for (const U& val : other) {
    				place_at(iter, val);
    				++iter;
    			}
    		}
    
    
    		pointer begin() noexcept {
    			return arr;
    		}
    		const_pointer begin() const noexcept {
    			return arr;
    		}
    		pointer end() noexcept {
    			return arr + N;
    		}
    		const_pointer end() const noexcept {
    			return arr + N;
    		}
    
    
    		static_array& operator=(const static_array& other) noexcept(std::is_nothrow_copy_assignable_v<type>)
    		requires std::is_copy_assignable_v<type> {
    			if (this == &other) {
    				return *this;
    			}
    			pointer iter = begin();
    			for (const_type& val : other) {
    				*iter = val;
    				++iter;
    			}
    			return *this;
    		}
    		template<typename U>
    		requires std::is_assignable_v<type, const U&>
    		static_array& operator=(const static_array<U, N>& other) noexcept(std::is_nothrow_assignable_v<type, const U&>) {
    			if (this == &other) {
    				return *this;
    			}
    			pointer iter = begin();
    			for (const U& val : other) {
    				*iter = val;
    				++iter;
    			}
    			return *this;
    		}
    		static_array& operator=(static_array&& other) noexcept
    		requires std::is_swappable_v<type> {
    			if (this == &other) {
    				return *this;
    			}
    			pointer iter = begin();
    			for (type& val : other) {
    				std::swap(*iter, val);
    				++iter;
    			}
    			return *this;
    		}
    
    
    		type& operator[](size_t index) {
    			if (!(index < N)) {
    				throw out_of_range();
    			}
    			return arr[index];
    		}
    		const_type& operator[](size_t index) const {
    			if (!(index < N)) {
    				throw out_of_range();
    			}
    			return arr[index];
    		}
    	};
    }

    namespace dte_token {
    	struct data_stack;
    	struct c_function {
    		struct metadata {
    			dte_utils::dynamic_cstring name;
    			//max jump index this function can output
    			size_t max_jump;
    			//size of data type pushed on stack
    			//if it is <=sizeof(void*) uses casted void* as data
    			size_t data_size_push;
    		};
    		using func = size_t(data_stack&, const semi_pointer::data&);
    		protected:
    			metadata _meta;
    			func* _body;
    			destructor* _args_destructor;
    		public:
    			c_function(func* body, const metadata& meta, destructor* args_destructor = nullptr);
    			c_function(func* body, metadata&& meta, destructor* args_destructor = nullptr);
    			c_function(const c_function& other) : _meta(other.get_meta()), _body(other.get_body()), _args_destructor(other.get_args_destructor()) {};
    			c_function(c_function&& other) noexcept;
    			const metadata& get_meta() const noexcept;
    			func* get_body() const noexcept;
    			destructor* get_args_destructor() const noexcept;
    			c_function& operator=(const c_function&) = delete;
    			c_function& operator=(c_function&&) = delete;
    			size_t operator()(data_stack& stack, const semi_pointer::data& spd) const;
    	};
    }

    using namespace dte_utils;
    using namespace dte_token;
    c_function::c_function(func* body, const metadata& meta, destructor* args_destructor) : _body(body), _meta(meta), _args_destructor(args_destructor) {}
    c_function::c_function(func* body, metadata&& meta, destructor* args_destructor) : _body(body), _meta(std::move(meta)), _args_destructor(args_destructor) {}
    c_function::c_function(c_function&& other) noexcept : _body(other._body), _meta(std::move(other._meta)) {}
    const c_function::metadata& c_function::get_meta() const noexcept {
    	return _meta;
    }
    c_function::func* c_function::get_body() const noexcept {
    	return _body;
    }
    destructor* c_function::get_args_destructor() const noexcept {
    	return _args_destructor;
    }
    size_t c_function::operator()(data_stack& stack, const semi_pointer::data& spd) const {
    	return _body(stack, spd);
    }
    Написано
  • Почему возникает ошибка C2512 в конструкторе с std::initializer_list?

    @communistic_sistema Автор вопроса
    jcmvbkbc, он указывает на массив: type arr[N];
    Написано
  • Почему возникает ошибка C2512 в конструкторе с std::initializer_list?

    @communistic_sistema Автор вопроса
    Wataru, C:\Users\User\Desktop\DynamicTokenEngine\DTE\Utility\memory\static_array.hpp(31,47): error C2512: dte_token::c_function: нет подходящего конструктора по умолчанию
    (компиляция исходного файла "main.cpp")
    C:\Users\User\Desktop\DynamicTokenEngine\DTE\TokenOperator\token\c_function.hpp(7,9):
    см. объявление "dte_token::c_function"
    C:\Users\User\Desktop\DynamicTokenEngine\DTE\Utility\memory\static_array.hpp(31,47):
    контекст создания экземпляра шаблона (сначала самый старый)
    C:\Users\User\Desktop\DynamicTokenEngine\DTE\DynamicTokenEngine\main.cpp(70,30):
    выполняется компиляция ссылки на экземпляр класс шаблон функции "dte_utils::static_array"
    C:\Users\User\Desktop\DynamicTokenEngine\DTE\Utility\memory\static_array.hpp(30,3):
    во время компиляции функции-члена класс шаблон "dte_utils::static_array::static_array(std::initializer_list)"
    C:\Users\User\Desktop\DynamicTokenEngine\DTE\DynamicTokenEngine\main.cpp(70,33):
    см. первую ссылку на "dte_utils::static_array::static_array" в "main"
    Написано
  • Как ждать в диапазоне атомарных чисел?

    @communistic_sistema Автор вопроса
    Wataru, у меня вызовов оператора функтора может быть несколькими потоками, но работа с полями только 1 и если все вызовы оператора завершились. При этом если есть взаимодействие не вызовом оператора функтора, сам оператор должен ждать, пока модификация функтора будет окончена. То есть если операторы выполняются - то они не блокируют друг-друга (ибо только читают), но они блокируют редактирование членов. Если редактирование членов началось - они ждут пока оно закончится.

    Я надеюсь, что описал задачу подробнее и понятнее.

    У меня была мысль с счетчиком: 0 - значит функтор не вызван (делаем -1 и работаем модифицируя/делаем +1 и работаем оператором), -1 это модификация (что блокирует операторы), [+1;-2] это число работающих операторов (вызванные потоками). Видимо она неверная.
    Написано
  • Как ждать в диапазоне атомарных чисел?

    @communistic_sistema Автор вопроса
    Wataru, мне нужно, чтобы взаимодействие с членами функтора допускалось только если функтор не исполняется
    Написано
  • Как проверить, что класс является функтором?

    @communistic_sistema Автор вопроса
    maaGames, смысл есть в том, что это разные способы вызова
    У меня через require сделан функтор для weak_ref
    Получается у меня 2 функтора с require, один для указателя на функцию и для оператора
    Это значит эти 2 функтора weak_ref надо разделить, иначе при генерации кода будут - неоднозначность вызова и ошибка в вызове operator(), если это функция или _instance() для указателя класса
    Написано
  • Как проверить, что класс является функтором?

    @communistic_sistema Автор вопроса
    maaGames, это интересное замечание, однако контекст - умный указатель, _instance это pointer, если это void() рапример, то это void(*)(), что вызывается как _instance(args...), если класс, то придется делать _instance->operator()(args...)
    Написано
  • Как проверить, что класс является функтором?

    @communistic_sistema Автор вопроса
    Wataru, у меня структура берет Т, мне Args нужно чисто для возвращаемого типа (известны только в шаблонном методе, шаблонной структуры), так что ответ с invoke_result_t подходит, для возвращаемого значения, но не подходит, чтобы различать функцию и объект
    Написано
  • Как проверить, что класс является функтором?

    @communistic_sistema Автор вопроса
    Дмитрий, зачем мне их различие, когда речь о наличии оператора в целом? В любой реализации
    Написано
  • Как проверить, что класс является функтором?

    @communistic_sistema Автор вопроса
    Wataru, мне нужно проверить, что я могу в шаблоне вызвать pointer->operator()(someargs...) и при этом отличать от указателя на функцию, который вызывается через pointer(someargs...)
    Написано
  • Как проверить, что класс является функтором?

    @communistic_sistema Автор вопроса
    Дмитрий, зачем знать перегрузку для наличия operator()?
    Написано
  • Как проверить, что класс является функтором?

    @communistic_sistema Автор вопроса
    Это не совсем то, это требует знание ...Args, чтобы установить, функтор ли это
    Написано
  • Насколько часто надо использовать модуль?

    @communistic_sistema Автор вопроса
    GavriKos, я понял, что имеются требования, а конкретные примеры есть? Ибо все еще не ясно, когда надо больше, а когда надо меньше модулей (а в ответе только параметры указаны, без связи с частотой использования модулей)
    Написано
  • Насколько часто надо использовать модуль?

    @communistic_sistema Автор вопроса
    Что значит
    модули дадут выигрыш в другом месте
    ? Что это за выигрыш?
    Я знаю только про выигрыш скорости компиляции (аналог прекомпилированных заголовков).
    Что значит
    все это может по разному быть в разных ветках/окружениях
    ?
    Написано
  • Почему шаблон выдает ошибку при включении заголовка в .cpp файл?

    @communistic_sistema Автор вопроса
    Wataru, прекомпилированных хэдеров нет, в проекте не включена инкрементная сборка, в любом случае спасибо
    Написано