【发布时间】:2019-05-17 07:35:12
【问题描述】:
我想初始化一个静态的std::map,其中的值是不可复制的。我会称我的班级为 ValueClass。 ValueClass 有一个 std::unique_ptr 作为私有成员,我什至通过扩展 non_copyable 来确保 ValueClass 不可复制,如下所示:
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 函数以启用初始化而不复制,但我失败了。我试过this、that 和other,但它们都不能用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 函数的解决方案,换句话说就是内联初始化,答案提供了函数调用的命令式解决方案。
【问题讨论】:
-
这张地图是否意味着在第一次初始化后可以在运行时编辑?我确实记得一个全局 const 结构的提议(甚至是实现),它提供自然初始化和类似地图的性能
-
我找到了这个链接:blog.knatten.org/2018/10/05/…,这可能会给你一些见解!
标签: c++ c++17 static-initialization noncopyable