Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使成员类型未知的类可以在列表/向量中使用?_C++_Templates_Casting - Fatal编程技术网

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可以实现您的目标。