gpt4 book ai didi

c++ - 如何编写作用于嵌套STL容器并限制最内层类型的模板函数模板

转载 作者:行者123 更新时间:2023-11-30 05:19:58 24 4
gpt4 key购买 nike

我目前正在试验STL容器的模板模板

template <template <typename, typename > class Container, typename element, typename Allocator>
void printsize (Container<element, Allocator> & a){
std::cout<<"container size: "<<a.size()<<std::endl;
};


int main(){

std::vector<double> testvector;

for(int i = 0; i < 4; ++i){
testvector.push_back((double) i);
}

printsize(testvector);

std::list<std::vector<double> > testlist;
for(int i = 0; i < 8; ++i){
testlist.push_back(testvector);
}
printsize(testlist);
}

正确输出是

container size: 4
container size: 8

我正在尝试将函数接受的模板类型的范围限制为类似

stl::container<double>.

如果我尝试这样的事情:

template <template <typename, typename > class Container, typename Allocator>
void printsize (Container<double , Allocator> & a){
std::cout<<"container size: "<<a.size()<<std::endl;
};

会让编译器报错

std::vector<int>

如预期的容器,但它不再适用于

std::list<std::vector< double> >

因为 double 是不同于 std::vector 的类型

但是,我希望我的函数仅对特定“基本”类型的任意 STL 容器和 STL 容器的 STL 容器(等等)起作用。

这背后的原因是我不想使用很多重载。基本上我想要实现的是编写一些函数

B dosomestuff(A a){
B b = someWorkDoneOnA(a);
return b;
}

stl::container<A> dosomestuff(stl::container<B> myContainer){
B newContainerElement;
stl::container<A> outputContainer;
for(auto i& : myContainer){
newContainerElement = dosomestuff(i);
outputContainer.push_back(newContainerElement);
}
return outputContainer;
};

到目前为止,我有一个作用于 B 的 vector 并创建 A 的 vector 的函数,该函数重载了另一个函数,该函数作用于 B 的 vector 的 vector 并输出 A 的 vector 的 vector (调用前一个函数)等等(老实说,现在就是这样,我认为我不需要更多,但谁知道呢?)。它实际上是同一段代码(类型声明除外),即 WET。

最佳答案

让我们从“B 的 N 嵌套容器”的类型特征开始(其中 N == 0 是 B)

template <typename T>
struct is_B : std::false_type;

template <template <typename, typename > class Container, typename Element, typename Allocator>
struct is_B<Container<Element, Allocator>> : std::is_B<Element>;

template <>
struct is_B<B> : std::true_type;

然后您可以使用 enable_if 扩充工作模板:

template <template <typename, typename > class Container, typename Element, typename Allocator>
void printThings(Container<std::enable_if<is_B<Element>::value, Element>, Allocator>) ...

这让我们成功了。然后我们制作一个集合类型的构造函数模板

template <typename T>
struct Bs_to_As {};

template <template <typename, typename > class Container, typename Element, typename Allocator>
struct Bs_to_As<Container<Element, Allocator>> { typedef Container<Bs_to_As<Element>::type, Allocator> type; }

template <>
struct Bs_to_As<B> { typedef A type; }

template <template <typename, typename > class Container, typename Element, typename Allocator>
Container<Bs_to_As<Element>, Allocator> doStuff(Container<Element, Allocator> myContainer)
{ ... }

关于c++ - 如何编写作用于嵌套STL容器并限制最内层类型的模板函数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40893593/

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