首页 > 解决方案 > 模板函数返回不相关类型的容器

问题描述

我有几个不相关类型的容器。我想编写一个模板函数来处理输入值并将它们插入到相应的容器中。这是我迄今为止最好的尝试:

#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()。理想情况下,我什至不需要声明单独的容器aSetbSet等等。如果有帮助,我可以制作所有这些类型的指针,但如果可能的话,我想远离set::set<void*>或类似的不透明编码。如果这是重复的,我很抱歉,搜索起来有点棘手。

标签: c++c++11templatesfunction-templatesstdset

解决方案


您可能可以使用以下代码:

template<typename T>
std::set<T>& getSet()
{
    static std::set<T> s;
    return s;
}

std::set这将为类型创建一个新的T,第一次getSet<T>()被调用。


推荐阅读