根据参数包值定义模板



此类中的方法使用一个索引序列,该序列包含覆盖整个data元组的索引序列(参数包中传递的每个参数的索引(。根据我看到的其他答案,我目前正在将我的方法模板化为:

#include <tuple>
#include <memory>
#include <vector>
using std::tuple;
template <typename... Args>
class Foo
{
protected:
tuple<std::shared_ptr<std::vector<Args>>...> data;
private:
template<size_t...Is>
void _clear_(std::index_sequence<Is...>) {
(std::get<Is>(data)->clear(), ...);
};
public:
void clear()
{ _clear_(std::index_sequence_for<Args...>()); };
};

不过,这看起来很混乱。我想知道是否有一种方法可以在类级别的范围内定义Is(或者,更普遍地说,是否有更好的方法可以做到这一点(。

对于C++17,您可以简单地使用std::apply:

void clear()
{
std::apply([](auto&... vs){ (vs.clear(), ...); }, data);
}

我想知道是否有一种方法可以在类级作用域中定义Is

带额外层:

template <typename Seq, typename...> class FooImpl;
template <std::size_t... Is, typename... Ts>
class FooImpl<std::index_sequence<Is...>, Ts...>
{
protected:
std::tuple<std::shared_ptr<std::vector<Ts>>...> data;
public:
void clear() { (std::get<Is>(data).clear(), ...); };
};
template <typename... Ts>
using Foo = FooImpl<std::make_index_sequence<sizeof...(Ts)>, Ts...>;

最新更新