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)