c++ - 模板函数返回不相关类型的容器
问题描述
我有几个不相关类型的容器。我想编写一个模板函数来处理输入值并将它们插入到相应的容器中。这是我迄今为止最好的尝试:
#include <iostream>
#include <set>
struct A {
// Must have operator< or std::less to insert into a std::set
// Probably a bad idea to do it by memory address
bool operator<(A const& other) const { return this < &other; }
};
struct B {
bool operator<(B const& other) const { return this < &other; }
};
struct C {
bool operator<(C const& other) const { return this < &other; }
};
std::set<A> aSet;
std::set<B> bSet;
std::set<C> cSet;
template
<typename T>
std::set<T>& getSet();
template
<>
std::set<A>& getSet<A>() { return aSet; }
template
<>
std::set<B>& getSet<B>() { return bSet; }
template
<>
std::set<C>& getSet<C>() { return cSet; }
template
<typename T>
void process(T const& value) {
std::set<T>& specializedSet(getSet<T>());
specializedSet.insert(value);
}
int main()
{
// do stuff
process(A()); process(A()); process(A());
process(B()); process(B());
process(C());
std::cout<<"Set has "<<getSet<A>().size()<<" element(s)\n"
<<"Set has "<<getSet<B>().size()<<" element(s)\n"
<<"Set has "<<getSet<C>().size()<<" element(s)"<<std::endl;
}
它产生预期的输出:
Set has 3 element(s)
Set has 2 element(s)
Set has 1 element(s)
我强烈希望不必专门getSet()
针对每种类型(我实际上有 10 种),尽管能够模板化是值得的process()
。理想情况下,我什至不需要声明单独的容器aSet
,bSet
等等。如果有帮助,我可以制作所有这些类型的指针,但如果可能的话,我想远离set::set<void*>
或类似的不透明编码。如果这是重复的,我很抱歉,搜索起来有点棘手。
解决方案
您可能可以使用以下代码:
template<typename T>
std::set<T>& getSet()
{
static std::set<T> s;
return s;
}
std::set
这将为类型创建一个新的T
,第一次getSet<T>()
被调用。
推荐阅读
- drools - 我在哪里可以查看模式是否在规则中失败?
- javascript - 如何使用javascript动态更改导航栏中的活动类
- oracle - 等待 Oracle DB 服务器通过 SSL 的响应时未调用 Netty channelRead
- java - AEM Asset API:根据需要创建中间目录
- node.js - 在 AWS EC2 上设置 socket.io 服务器
- ios - 无法在 Mac OS Catalina 上安装 fastlane
- html - 什么是在 mongodb 中正确存储 html 文件
- linear-programming - 这种行为是否表明我有记忆问题?
- jsf - 如何修复“UT010050:过滤器映射 SERVLET 中使用的过滤器 Richfaces - 未找到 Faces Servlet”
- c++ - 与碰撞检测作斗争。如何正确检测碰撞?