gpt4 book ai didi

C++ 如何扩展模板以使用 vector

转载 作者:搜寻专家 更新时间:2023-10-31 01:42:17 25 4
gpt4 key购买 nike

不幸的是,我的实际模板中充满了与我的问题无关的内容,因此我尝试将所有内容都放在一个简短的示例中。可以说,我编写了以下模板:

#include <vector>
template <typename T> class MyTemplate{
public:
typedef void(*MyFunc)(T);
void addFunc(MyFunc f){myFuncs.push_back(f);}
void callFuncs(T value){
for (std::size_t i=0;i<myFuncs.size();i++){myFuncs[i](value);}
}
private:
std::vector<MyFunc> myFuncs;
};

我已经了解到,当传递的类型是 vector 时,我可以专门化此模板以使其表现不同,所以我这样写:

template <typename T> class MyTemplate<std::vector<T> > {
public:
typedef void(*MySingleElementFunc)(T);
void addSingleElementFunc(MySingleElementFunc f){
this->mySingleElementFuncs.push_back(f);
}
void callFuncs(std::vector<T> value){
//for (std::size_t i=0;i<myFuncs.size();i++){
// myFuncs[i](value);
//}
for (std::size_t i=0;i<mySingleElementFuncs.size();i++){
for (int size_t i=0;i<value.size();i++){
mySingleElemetnFuncs[i](value[i]);
}
}
}
private:
std::vector<MySingleElementFunc> mySingleElementFuncs;
};

现在我的问题是,最优雅的方法是什么(如果可能的话没有继承),不仅要针对 vector< T > 的情况专门化模板,而且同时仍然能够使用第一个模板方法,其中 vector < T > 是模板参数。稍后我想做的是以下内容

void Func1(int i){}
void Func2(std::vector<int> i){}

MyTemplate<std::vector<int> > myTemplate;
myTemplate.addFunc(Func1);
myTemplate.addFunc(Func2);

是否可以在不简单地从原始模板复制和粘贴我需要的所有内容的情况下实现这一目标,也可以对专用版本执行相同的操作?我想我将不得不使用某种继承。但是,我想避免这样的事情:

MyTemplate<std::vector<int> > myTemplate;
// myTemplate.addFunc(Func1); // does not work
myTemplate.addFunc(Func2);
MyVectorTemplate<std::vector<int> > myVectorTemplate;
myVectorTemplate.addFunc(Func1); // works
myVectorTemplate.addFunc(Func2);

即功能应该只由传递给模板的类型决定,而不是由选择适当的子类决定。无论如何,我不得不承认我对在这种情况下如何继承有点困惑。如果它不是模板,我可以写类似的东西

class MyVectorClass : public MySingleObjectClass {}

但是,以下内容没有任何意义:

template <typename T> MyTemplate<std::vector<T> > : public MyTemplate<std::vector<T> >

但从某种意义上说,这就是我想要的。

我很抱歉发了这么长的帖子,我希望它或多或少清楚我的问题是什么......

编辑:我刚刚在上面的代码中发现了一个错误。 vector 模板中的循环应该是

for (std::size_t i=0;i<mySingleElementFuncs.size();i++){
for (int size_t j=0;j<value.size();j++){
mySingleElemetnFuncs[i](value[j]);
}
}

即每个注册的函数都应该为 vector 中的每个条目调用一次。 (否则,如果注册函数的数量不等于 vector 的大小,模板将不起作用。)

最佳答案

事实上,您希望为特化添加功能,例如:

template <typename T> class MyTemplate<std::vector<T> >
{
public:
typedef void(*MySingleElementFunc)(T);
typedef void(*MyVectorFunc)(std::vector<T>);

void addSingleElementFunc(MyVectorFuncf){
this->myVcetorFuncs.push_back(f);
}

void addSingleElementFunc(MySingleElementFunc f){
this->mySingleElementFuncs.push_back(f);
}

void callFuncs(const std::vector<T>& value){
for (std::size_t i=0;i<myVectorFuncs.size();i++){
myVectorFuncs[i](value);
}
for (std::size_t i=0;i<mySingleElementFuncs.size();i++){
for (int size_t i=0;i<value.size();i++){
mySingleElemetnFuncs[i](value[i]);
}
}
}
private:
std::vector<MySingleElementFunc> mySingleElementFuncs;
std::vector<MyVectorFunc> myVectorFuncs;
};

关于C++ 如何扩展模板以使用 vector<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27188706/

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