gpt4 book ai didi

c++ - 在具有不同类型的 vector 中使用模板结构

转载 作者:行者123 更新时间:2023-11-30 02:27:16 25 4
gpt4 key购买 nike

你好,这是我的 C++ 源代码

template <typename T>
struct Key
{
string Name;
T Value;
};

struct Block
{
string Name;
vector <Key> Keys; // I got error here ... !!!!
};

int main()
{
Block thisBlock;

Key <bool> Key1;
Key <string> Key2;

// Set key 1
Key1.Name = "Key1";
Key1.Value = false;

// Set key 2
Key2.Name = "Key2";
Key2.Value = "Hey";

// Set block with all keys
thisBlock.Name = "Block1";
thisBlock.Keys.push_back(Key1);
thisBlock.Keys.push_back(Key2);

return 0;
}

请指导我解决这个错误!我知道我必须使用 <>vector <Key>但如果我这样做,我的 block key 仅限于该类型!有什么办法可以解决这个问题吗?

错误

argument list for class template "Key" is missing (in block struct (vector <key>>)

最佳答案

Key<bool>Key<string>是两种不同的类型,彼此无关,因此,您不能将它们都存储在一个 std::vector 中,就像你不能创建 std::vector存储 intfloat .

要解决这个问题,您可以为您的 key 创建一个公共(public)基类,如下所示:

class KeyBase {
public:
virtual ~KeyBase() = default; // virtual destructor to avoid memory leaks
std::string GetName() const { return name; }// some common functions
virtual std::string ToString() const = 0; // and some function to be overriden
std::string name; // and members

KeyBase(std::string name_) : name(name_) {};
KeyBase() = default;
};

template<class T>
class Key : public KeyBase {
public:
std::string ToString() const override { ... } // implementation of virtual functions
T value;
};

...
std::vector<std::unique_ptr<KeyBase>> vk;
vk.push_back(std::make_unique<Key<bool>>());
vk.push_back(std::make_unique<Key<string>>());
std::cout << vk[0]->GetName() << ' ' << vk[1]->GetName(); // Works
std::cout << vk[0]->value << ' ' << vk[1]->value; // Does not work as KeyBase has no value
std::cout << dynamic_cast<Key<bool>*>(vk[0].get())->value; // Works as vk[0] is now casted

std::unique_ptr这里使用的是一种智能指针类型——它的语义就像指针一样,但它 delete s 是 delete 时的存储对象d,使内存管理更容易。同样重要的是 std::vector存储指向 KeyBase 的指针,而不是 KeyBase .这样做是为了避免对象切片。

此外,请使用 std::dynamic_cast小心:它会返回 nullptr如果您尝试转换为不正确的类型。

UP:在push_back期间设置值操作,一种方法是使用辅助函数和设置构造函数:

template<typename T>
class Key : public KeyBase {
...
Key(T val) : value(val) {}
Key(T val, std::string name) : KeyBase(name), value(val) {}
}

template<typename T>
std::unique_ptr<Key<T>> createKey(T value) {
return std::make_unique<Key<T>>(value);
}
template<typename T>
std::unique_ptr<Key<T>> createKey(T value, std::string name) {
return std::make_unique<Key<T>>(value, name);
}

...
vk.push_back(createKey<bool>(false));
vk.push_back(createKey<string>("abc"));

实际上,使用这种方法您甚至可以省略类型名称,如下所示:

vk.push_back(createKey(1, "abc")); // creates Key<int> with value 1 and name "abc"

但是要格外小心这样的遗漏,例如"abc"类型为 const char*所以 createKey("abc")将创建 Key<const char*> .

关于c++ - 在具有不同类型的 vector 中使用模板结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41893489/

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