将元组解包到成员初始化或超类构造函数
Unpack tuple to member initialization or superclass constructor
是否可以使用元组中包含的参数初始化 class 的成员(或调用 superclass 构造函数)?
请注意,我知道 std::make_from_tuple()
和 std::apply()
,但在这种情况下不能使用它们。
考虑 sometype
非 可复制,非 默认构造,非可移动,非 可分配,非任何其他。实例化它的唯一方法是使用作为 std::tuple
提供的参数。
这能做到吗?
虽然 index_sequence 生成应该是一个,但我的尝试显然失败了 "expansion pattern contains no argument pack"。
class node {
public:
sometype value;
template <typename... Args>
explicit node(const std::tuple<Args...>& args_tuple) :
value(
std::get<
std::index_sequence_for<Args...>{}
>(args_tuple)...
) {
}
};
如果你坚持不使用std::make_from_tuple()
,你需要另一个间接层:
public:
explicit node(const std::tuple<Args...>& args_tuple) :
node(args_tuple, std::make_index_sequence<sizeof...(Args)>{})
{ }
private:
template<class Tuple, std::size_t... is>
node(const Tuple& args_tuple, std::index_sequence<is...>) :
value(std::get<is>(args_tuple)...)
{ }
是否可以使用元组中包含的参数初始化 class 的成员(或调用 superclass 构造函数)?
请注意,我知道 std::make_from_tuple()
和 std::apply()
,但在这种情况下不能使用它们。
考虑 sometype
非 可复制,非 默认构造,非可移动,非 可分配,非任何其他。实例化它的唯一方法是使用作为 std::tuple
提供的参数。
这能做到吗?
虽然 index_sequence 生成应该是一个,但我的尝试显然失败了 "expansion pattern contains no argument pack"。
class node {
public:
sometype value;
template <typename... Args>
explicit node(const std::tuple<Args...>& args_tuple) :
value(
std::get<
std::index_sequence_for<Args...>{}
>(args_tuple)...
) {
}
};
如果你坚持不使用std::make_from_tuple()
,你需要另一个间接层:
public:
explicit node(const std::tuple<Args...>& args_tuple) :
node(args_tuple, std::make_index_sequence<sizeof...(Args)>{})
{ }
private:
template<class Tuple, std::size_t... is>
node(const Tuple& args_tuple, std::index_sequence<is...>) :
value(std::get<is>(args_tuple)...)
{ }