允许模板化的结构化绑定 class
Allow structured bindings for templated class
所以我有一些 class 想添加结构化绑定支持。
但是我不知道如何使用模板化的 class 来专门化 std::tuple_element
和 std::tuple_size
。
这是我的尝试:
template<typename... Cmps>
struct CmpGroup
{
std::array<void*, sizeof...(Cmps)> cmps;
template<typename C>
C& get()
{
constexpr int index = GetIndexInPack<C, Cmps...>::value;
static_assert(index != -1);
return *static_cast<C*>(index);
}
template<size_t I>
auto& get()
{
static_assert(I < sizeof...(Cmps));
using CmpType = typename GetTypeInPack<I, Cmps...>::type;
return *static_cast<CmpType*>(cmps[I]);
}
};
namespace std
{
template<typename... Types>
struct tuple_size<CmpGroup<Types...>> : public integral_constant<size_t, sizeof...(Types)>;
template<std::size_t N, typename... Types>
struct tuple_element<N, CmpGroup<Types...>> {
//got this from: https://blog.tartanllama.xyz/structured-bindings/
using type = decltype(std::declval<CmpGroup<Types...>>().template get<N>());
};
}
(为了清晰起见,我省略了一些特定于实现的内容,可以找到完整的代码片段 here )
然而,这会导致 tuple_size 特化给出编译错误:error C2143: syntax error: missing ',' before ';'
甚至可以允许模板化 class 具有结构化绑定,还是我遗漏了什么?
事实证明,我的 tuple_size
专业需要 body,但我忽略了。
template<typename... Types>
struct tuple_size<CmpGroup<Types...>> : public integral_constant<size_t, sizeof...(Types)>{};
------------------------------------------------------------------------------------------^^
感谢@BoPersson 指出这一点!
所以我有一些 class 想添加结构化绑定支持。
但是我不知道如何使用模板化的 class 来专门化 std::tuple_element
和 std::tuple_size
。
这是我的尝试:
template<typename... Cmps>
struct CmpGroup
{
std::array<void*, sizeof...(Cmps)> cmps;
template<typename C>
C& get()
{
constexpr int index = GetIndexInPack<C, Cmps...>::value;
static_assert(index != -1);
return *static_cast<C*>(index);
}
template<size_t I>
auto& get()
{
static_assert(I < sizeof...(Cmps));
using CmpType = typename GetTypeInPack<I, Cmps...>::type;
return *static_cast<CmpType*>(cmps[I]);
}
};
namespace std
{
template<typename... Types>
struct tuple_size<CmpGroup<Types...>> : public integral_constant<size_t, sizeof...(Types)>;
template<std::size_t N, typename... Types>
struct tuple_element<N, CmpGroup<Types...>> {
//got this from: https://blog.tartanllama.xyz/structured-bindings/
using type = decltype(std::declval<CmpGroup<Types...>>().template get<N>());
};
}
(为了清晰起见,我省略了一些特定于实现的内容,可以找到完整的代码片段 here )
然而,这会导致 tuple_size 特化给出编译错误:error C2143: syntax error: missing ',' before ';'
甚至可以允许模板化 class 具有结构化绑定,还是我遗漏了什么?
事实证明,我的 tuple_size
专业需要 body,但我忽略了。
template<typename... Types>
struct tuple_size<CmpGroup<Types...>> : public integral_constant<size_t, sizeof...(Types)>{};
------------------------------------------------------------------------------------------^^
感谢@BoPersson 指出这一点!