这是一个类似于这个帖子的问题。我认为最有前途的答案与模板化静态初始化有关。以下是该答案中的类:
这对于结构体、类和基本类型都非常适用。我想要做的是将这个方法用于值为
但是尝试使用create_map初始化它会失败:
我得到的错误是这样的:
我遇到了同样的错误。在写这篇文章时,我意识到问题可能与继承有关,而不一定是create_map的运算符。您能帮助我找出需要使其正常工作的operator()定义或基类/派生类定义吗?
请注意,由于我在工作中不允许使用Boost C++库,请限制您的答案不包括这些库。
编辑:根据T.C.的要求更新了MyFieldInterface。
template <typename T, typename U>
class create_map
{
private:
std::map<T, U> m_map;
public:
create_map(const T& key, const U& val)
{
m_map[key] = val;
}
create_map<T, U>& operator()(const T& key, const U& val)
{
m_map[key] = val;
return *this;
}
operator std::map<T, U>()
{
return m_map;
}
};
使用方法:
std::map mymap = create_map<int, int >(1,2)(3,4)(5,6);
这对于结构体、类和基本类型都非常适用。我想要做的是将这个方法用于值为
unique_ptr<Structure\Class>
的情况,就像这样:std::map mymap = create_map<DWORD, std::unique_ptr<Structure|Class>>(1, new Structure|Class())(2, new Structure|Class())
我正在尝试使用模板类,以便值可以是任何类型。我从这个帖子中得到了灵感,使用接口作为基类,然后使用模板派生类来保存任何类型的值。因此,这些类看起来像这样:
class MyFieldInterface
{
public:
int m_Size;
virtual ~MyFieldInterface() = default;
}
template <typename T>
class MyField : public MyFieldInterface {
T m_Value;
}
那么地图可以按照我之前描述的方式进行设置:
std::map<DWORD, unique_ptr<MyFieldInterface>> mymap;
但是尝试使用create_map初始化它会失败:
std::map mymap = create_map<DWORD, unique_ptr<MyFieldInterface>>(1, new MyField<DWORD>())(2, new MyField<char>())(3, new MyField<WORD>())
我得到的错误是这样的:
operator()
Error: no instance of constructor "create_map<T, U>::create_map [with T=DWORD, U=std::unique_ptr<MyFieldInterface, std::default_delete<MyFieldInterface>>]" matches the argument list
argument types are: (DWORD, MyField<DWORD>*)
所以我认为需要一个构造函数和operator()来正确地处理指针。 我将它们都添加到了类中:
create_map(const T& key, const U* val)
{
m_map[key] = val;
}
create_map<T, U>& operator()(const T& key, const U* val)
{
m_map[key] = val;
return *this;
}
我遇到了同样的错误。所以我尝试不使用*
:
create_map(const T& key, const U val)
{
m_map[key] = val;
}
create_map<T, U>& operator()(const T& key, const U val)
{
m_map[key] = val;
return *this;
}
我遇到了同样的错误。在写这篇文章时,我意识到问题可能与继承有关,而不一定是create_map的运算符。您能帮助我找出需要使其正常工作的operator()定义或基类/派生类定义吗?
请注意,由于我在工作中不允许使用Boost C++库,请限制您的答案不包括这些库。
编辑:根据T.C.的要求更新了MyFieldInterface。
new
,这是不安全的。此外,MyFieldInterface
需要一个虚析构函数。 - T.C.unique_ptr
无法复制,这几乎需要对create_map
进行重大手术。 - T.C.MyFieldInterface
。我也考虑了你的其他评论。我改用了std::shared_ptr
和std::make_shared
,问题得到了很好的解决。错误已经消失了。一旦我有机会测试它,我会把它写成答案。感谢你指引我正确的方向。 - gtrigity