C++ 如何使成员类型未知的类可以在列表/向量中使用?
我试图创建一个类,它的类型由传递给另一个类的任何类型决定。下面是一个删除所有不相关内容的示例:C++ 如何使成员类型未知的类可以在列表/向量中使用?,c++,templates,casting,C++,Templates,Casting,我试图创建一个类,它的类型由传递给另一个类的任何类型决定。下面是一个删除所有不相关内容的示例: class foo_list{ private: std::list<foo_template>list; public: template<class t> void addToList(t data,(something else unrelated)){ list.push_back(new task<t>(data)
class foo_list{
private:
std::list<foo_template>list;
public:
template<class t>
void addToList(t data,(something else unrelated)){
list.push_back(new task<t>(data));
}
}
template<class t>
class foo_template{
private:
t data
someOtherStuffThatIsUnrelated
.
.
.
}
class foo\u列表{
私人:
std::列表;
公众:
模板
void addToList(t数据,(其他无关内容)){
列表。推回(新任务(数据));
}
}
模板
类foo_模板{
私人:
t数据
其他一些无关的东西
.
.
.
}
然而,类似这样的东西无法编译。主要是因为没有固定类型的模板不能用作另一个模板的类型(或任何其他模板)
实现这种功能的(正确)方法是什么,最好是保留完整的类型信息,或者是回溯到原始类型。最直接的方法是使用虚拟函数。由于您只持有指针列表,没有任何进一步的类型信息,因此必须以某种方式在运行时保存和访问它
#include <iostream>
#include <list>
#include <memory>
#include <string>
class Base {
public:
virtual void bar() const = 0;
};
template <typename T>
class Foo_template : public Base {
T t;
public:
Foo_template(const T& tt) : t(tt) { }
void bar() const override {
std::cout << t << '\n';
}
};
class Foo_list {
std::list<std::unique_ptr<Base>> list;
public:
template <typename T>
void add_to_list(T&& data) {
auto ptr = std::make_unique<Foo_template<T>>(std::forward<T>(data));
list.push_back(std::move(ptr));
}
void bar_all() {
for(auto& elem : list) elem->bar();
}
};
int main() {
Foo_list list;
list.add_to_list(2);
list.add_to_list(std::string{ "Hello, World!" });
list.bar_all();
}
#包括
#包括
#包括
#包括
阶级基础{
公众:
虚空条()常数=0;
};
模板
类Foo_模板:公共基{
T;
公众:
Foo_模板(const T&tt):T(tt){}
void bar()常量重写{
std::cout最直接的方法是使用虚拟函数。由于您只持有指针列表,没有任何进一步的类型信息,因此必须以某种方式在运行时保存和访问它
#include <iostream>
#include <list>
#include <memory>
#include <string>
class Base {
public:
virtual void bar() const = 0;
};
template <typename T>
class Foo_template : public Base {
T t;
public:
Foo_template(const T& tt) : t(tt) { }
void bar() const override {
std::cout << t << '\n';
}
};
class Foo_list {
std::list<std::unique_ptr<Base>> list;
public:
template <typename T>
void add_to_list(T&& data) {
auto ptr = std::make_unique<Foo_template<T>>(std::forward<T>(data));
list.push_back(std::move(ptr));
}
void bar_all() {
for(auto& elem : list) elem->bar();
}
};
int main() {
Foo_list list;
list.add_to_list(2);
list.add_to_list(std::string{ "Hello, World!" });
list.bar_all();
}
#包括
#包括
#包括
#包括
阶级基础{
公众:
虚空条()常数=0;
};
模板
类Foo_模板:公共基{
T;
公众:
Foo_模板(const T&tt):T(tt){}
void bar()常量重写{
std::你能粘贴编译器输出吗?高度相关你制作一个模板并传入类型。@nwp我希望列表中的每个任务都是不同的类型你能粘贴编译器输出吗?高度相关你制作一个模板并传入类型。@nwp我希望列表中的每个任务都是不同的类型nt类型我有一个问题:我如何从任务中访问数据成员?我是否只返回类型为t的数据?如果是这样,我如何在不丢失类型信息的情况下返回它?还有关于向量的事情。我希望能够尽快使用列表。我认为经典的双链接列表更适合于此?你为什么想要t这样做?这几乎打破了封装的原则。你应该问问自己,为什么要将不同的不相关类型分组在一起,以及它们有哪些相同的操作。在我的示例中,它们都是可打印的。关于排序列表问题:长话短说:向量更快。我不是说“acess”与直接访问成员一样,但是实现get和set方法,这可以使用向量中的内容使用。检查上面给出的链接。使用std::variant或std::any可以实现您的目标。我有一个问题:我如何从任务访问数据成员?我是否只返回类型为t的数据?如果是,我如何处理ally在不丢失类型信息的情况下返回它?还有关于向量的事情。我希望能够尽快使用列表。我认为经典的双链接列表更适合这样做?为什么要这样做?这几乎打破了封装的原则。你应该问自己为什么要对不同的对象进行分组在我的例子中,它们都是可打印的。关于排序列表问题:长话短说:向量更快。我不是说“acess”与直接访问成员一样,但是实现get和set方法,这可以使用向量中的内容使用..查看上面给出的问题链接。使用std::variant或std::any可以实现您的目标。