我想初始化一个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 编译。
如何使用 Visual Studio 编译器在不强制复制的情况下初始化静态 std::map 并在一个函数中统一初始化?
编辑: 这是我试图让它工作的现实生活场景的简化版本(请原谅我缺乏命名约定和案例不一致):
#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
函数的解决方案,换句话说就是内联初始化,提供的答案是函数调用的命令式解决方案。