Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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 - Fatal编程技术网

C++ 模板的一般向量

C++ 模板的一般向量,c++,templates,C++,Templates,对我来说,模板的通用向量是可以接受任何参数列表的模板的向量。像这样 vector<Foo<?>> foos; foos.push_back(Foo<int>(5)); foos.push_back(Foo<Bar>(Bar())); foos.push_back(Foo<string>("bar")); vector>调度员;//这里是第二个.on(回调); //std::shared_ptr chunk=mChunks.find(p

对我来说,模板的通用向量是可以接受任何参数列表的模板的向量。像这样

vector<Foo<?>> foos;
foos.push_back(Foo<int>(5));
foos.push_back(Foo<Bar>(Bar()));
foos.push_back(Foo<string>("bar"));
vector>调度员;//这里是第二个.on(回调);
//std::shared_ptr chunk=mChunks.find(pos)->秒;
}
模板void invokeListener(std::string eventID,T…args)
{
如果(!dispatchers.count(eventID))
{
返回;
}
dispatchers.find(eventID)->second->trigger(args…);
}
};
#恩迪夫
既然这似乎不可能,我该如何解决我的问题呢?

简单的答案是否定的

编译器需要找出类型和大小

编辑

使用继承

乙二醇

类事件{
私人:
std::字符串m_id;
公众:
事件(std:string&id):m_id(id){}
std:string eventid()常量{return m_id;}
虚拟void DoEvent()=0;
};
MyEvent类:事件{
公众:
MyEvent():事件(“MyEvent”){}

DoEvent(){std::coutNo,这是不可能的。类模板是模板,而不是类型。
std::vector
模板要求类型作为其第一个参数,而不是模板

可以使用类模板生成类型,但必须为
std::vector
模板的每个实例化选择一个特定类型


一般来说,模板参数的性质告诉你可以使用什么样的参数。在C++中有三个“本体层次”:值(“有类型的事物”、类型(“类型的事物”)和模板(“使三个中的任何一个都有”)。每个都可以作为模板参数:

template < int A                        // Value (int prvalue)
         , typename B,                  // Type
         , template <typename> class C  // Template
         > struct Foo {};

Foo<10, double, std::allocator> foo;
//   A     B            C
模板结构Foo{};
富富,;
//A、B、C

std::vector是一个同质容器,这意味着它只能包含一种类型。请注意,Foo是一个类型家族,而不是单一类型,std::vector的类型因模板参数而异

现在,您可以使用两种方法来实现您想要的功能,第一种方法是通过删除类型,例如,您可以使用
std::vector
,但是请注意,它完全删除了类型(类型信息丢失),并且不是编译时操作


第二种方法是使用,这是一个编译时固定大小的容器,这意味着您不能在运行时添加新元素,因为每个对象的类型都是在编译时确定的。

谢谢。那么在我的例子中,如何绕过它(参见编辑)?@Vinz243:我不会称之为“限制”这是C++类型和对象模型的一个相当深刻和基本的方面(参见编辑).但是a)在这个网站上搜索数百个副本,b)想想你怎么可能使用这样一个假想的对象。好吧,我理解这是不好的。我应该如何改进我的代码以避免这种情况?@Vinz243;你不能改进它。你需要完全重新思考发生了什么。首先回答我的问题(b)上图:您将如何使用假设的泛型向量?您应该立即看到这一点毫无意义。您如何知道哪个回调适用于哪个参数?因为指定了字符串。它是一个事件id,每个事件都有自己的参数,否?您可能正在寻找类型擦除。您可以尝试
std::vector
,具有从该基类继承的
EventDispatcher
的所有专门化。@Potatostater基类包含什么?它需要再次指定参数列表,不是吗?它应该是一个抽象基类,根据需要具有虚拟函数。基类不应该是模板或已知的找出任何派生类。然后我松开了我的模板,不是吗?哦,等等,我刚刚理解了。事件模式,但使用类而不是模板。但我需要找出之前的多个事件,然后在基类或其他类中添加匹配的函数?
class Event {
   private:
      std::string m_id;
   public:
       Event(std:string &id) : m_id(id) { }
       std:string EveentId() const { return m_id;}
       virtual void DoEvent() = 0;
};

class MyEvent : Event {
   public:
      MyEvent() : Event("MyEvent") { }
       DoEvent() { std::cout << "MyEvent" << std::endl;
};
std::vector<std::shard_ptr<Event>> events;

events.push_back<std::make_shared<MyEvent>());

events[0]->DoEvent();
template < int A                        // Value (int prvalue)
         , typename B,                  // Type
         , template <typename> class C  // Template
         > struct Foo {};

Foo<10, double, std::allocator> foo;
//   A     B            C