Я хотел бы инициализировать статический std::map
, где значение не может быть скопировано.Я позвоню своему классу ValueClass . ValueClass имеет std::unique_ptr
в качестве частного члена, и я даже гарантирую, что ValueClass не будет копируемым, расширив non_copyable
, который выглядит следующим образом:
class non_copyable {
public:
non_copyable() = default;
protected:
virtual ~non_copyable() = default;
private:
non_copyable(const non_copyable&) = delete;
non_copyable& operator=(const non_copyable&) = delete;
};
Теперь я пытаюсьопределить std :: map, используя мой класс в качестве значения:
static std::map<int, ValueClass> value_classes = {
{0, ValueClass()},
{1, ValueClass() }
};
Я получаю ошибку компиляции, когда initializer_list
пытается скопировать этот класс.
Я пытался написать свой собственный make_map
работает в течение этих выходных в течение многих часов, чтобы включить инициализацию без копирования, но мне не удалось.Я пытался это , , что и другие , но ни один из них не компилируется с Visual Studio 15.9.4.
Как я могу инициализировать статическийstd :: map, где копирование не принудительное, а инициализация выполняется в одной функции с использованием компилятора Visual Studio?
РЕДАКТИРОВАТЬ: Вот упрощенная версия сценария реальной жизни, где яя пытаюсь заставить это работать (простите за отсутствие соглашения об именах и несогласованность для случаев):
#include <iostream>
#include <map>
class non_copyable {
public:
non_copyable() = default;
protected:
virtual ~non_copyable() = default;
private:
non_copyable(const non_copyable&) = delete;
non_copyable& operator=(const non_copyable&) = delete;
};
class InnerValueClass : public non_copyable
{
public:
InnerValueClass(const int inner_number) : inner_number_(inner_number) { }
private:
int inner_number_;
};
class ValueClass : public non_copyable
{
public:
ValueClass(const int number1) : number1_(number1) { }
ValueClass(const bool condition) : condition_(condition), inner_value_(
std::make_unique<InnerValueClass>(5)) { }
private:
int number1_{};
bool condition_{};
std::unique_ptr<InnerValueClass> inner_value_{};
};
/* Inline initialization of std::map copies, this is for initialization of non-copy types*/
template <typename TKey, typename TNonCopyableValue>
class make_map_by_moving
{
typedef std::map<TKey, TNonCopyableValue> map_type;
map_type map_;
public:
make_map_by_moving(const TKey& key, TNonCopyableValue&& val)
{
map_.emplace(key, std::move(val));
}
make_map_by_moving<TKey, TNonCopyableValue>& operator()(const TKey& key, TNonCopyableValue&& val)
{
map_.emplace(key, std::move(val));
return *this;
}
operator const map_type&()
{
return map_;
}
};
static std::map<int, ValueClass> map =
make_map_by_moving<int, ValueClass>
(1, ValueClass(5))
(2, ValueClass(true));
/* It goes on like this for hundreds of lines, so I really appreciate any
solution that leave me with a clean initialization rather than calling
functions on std::map */
int main() { }
Повторное редактирование: Решение, предоставленное в этом вопросе, не работает в классеструктура у меня есть.Я также ищу решение, чтобы исправить функцию make_map_by_moving
, другими словами, встроенную инициализацию, ответ при условии, что есть императивное решение с вызовами функций.