如何在可变参数模板上生成递归数据结构?

kfm*_*e04 4 c++ templates recursive-datastructures variadic-templates c++11

我试图用这个问题掌握使用TMP 的递归数据结构生成技术.

假设我有一个可变参数模板 template<typename... Ts> struct my_sets { };.

my_sets我想生成一个数据成员依赖的新类型Ts.

例如,我希望每个元素/类型my_sets都有一个std::set<T>数据成员Ts...

using x_t = my_sets<int,char,std::string>;
x_t x;

x.insert<0>(   5   );  // into a std::set<int> member in my_sets<>
x.insert<1>(  'z'  );  // into a std::set<char> member in my_sets<>
x.insert<2>( "foo" );  // into a std::set<std::string> member in my_sets<>
Run Code Online (Sandbox Code Playgroud)

我认为实现这一目标的一种方法可能是使用子类化和递归,但我不确定.

fwiw,如果通过自由函数或普通函数重载更直接地实现mutator,那也没关系:

insert<0>( x,   5   );  // into a std::set<int> member in my_sets<>
insert<1>( x,  'z'  );  // into a std::set<char> member in my_sets<>
insert<2>( x, "foo" );  // into a std::set<std::string> member in my_sets<>
Run Code Online (Sandbox Code Playgroud)

Xeo*_*Xeo 12

std::tuple这里有什么问题?

#include <tuple>
#include <set>

template<class... Ts>
using my_sets = std::tuple<std::set<Ts>...>;

// ...

auto x = my_sets<int, char, std::string>;

std::get<0>(x).insert(5);
std::get<1>(x).insert('z');
std::get<2>(x).insert("foo");
Run Code Online (Sandbox Code Playgroud)

对于外观,添加一个自由insert函数:

#include <utility>

template<std::size_t I, class SetTuple, class Arg>
auto insert(SetTuple& st, Arg&& arg)
  -> decltype(std::get<I>(st).insert(std::forward<Arg>(arg)))
{
  return std::get<I>(st).insert(std::forward<Arg>(arg));
}
Run Code Online (Sandbox Code Playgroud)