gpt4 book ai didi

c++ - 填充结构类型模板化的结构成员

转载 作者:行者123 更新时间:2023-11-30 04:58:22 26 4
gpt4 key购买 nike

我有一个函数 getmp(),它填充一些键值对并返回。

map<string, string> getmp()
{
map<string, string> mp;
//fill mp

return mp;
}

键值对将是以下结构之一的变量值(将有更多)。将有一个 id 成员来标识这些值对应的结构。

struct A
{
int a;
string b;
};

struct B
{
string c;
};

现在我想使用这个 map 填充正确的结构。

template<typename T>
T* fill(map<string, string> mp)
{
T *obj = new T();

//if T is A
obj->a = stoi(mp["a"]);
obj->b = mp["b"];

//else if T is B
obj->c = mp["c"];

return obj;
}

并且会被调用

int main()
{
map<string, string> mp = getmp();
// fill mp for A if mp["id"] = 1
A *a = fill<A>(mp);

//else fill mp for B if mp["id"] 2
B *b = fill<B>(mp);
return 0;
}

我可以维护一个单独的映射来识别 id 1Aid 2B。应该有什么样的额外映射,我可以用它来识别正确的模板参数 AB

我如何编写我的 fill() 来确定要填充的值?

最佳答案

对于 C++17,您可以使用 if constexpr:

template<typename T>
std::unique_ptr<T> fill(map<string, string> mp)
{
auto obj = std::make_unique<T>();

if constexpr (std::is_same<A, T>::value) {
obj->a = stoi(mp["a"]);
obj->b = mp["b"];
else if constexpr (std::is_same<B, T>::value) {
obj->c = mp["c"];
}
return obj;
}

以前,您可能会使用特化:

template<typename T>
std::unique_ptr<T> fill(map<string, string> mp)
{
return std::make_unique<T>();
}

template <>
std::unique_ptr<A> fill(map<string, string> mp)
{
auto obj = std::make_unique<A>();

obj->a = stoi(mp["a"]);
obj->b = mp["b"];
return obj;
}

template <>
std::unique_ptr<B> fill(map<string, string> mp)
{
auto obj = std::make_unique<A>();

obj->c = mp["c"];
return obj;
}

关于c++ - 填充结构类型模板化的结构成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51672115/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com