Вот

ел бы инициализировать статический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 функция, другими словами, встроенная инициализация, ответ при условии, что есть императивное решение с вызовами функций.

Ответы на вопрос(1)

Ваш ответ на вопрос