1

集約初期化の能力をテストし、サイズをカウントするために構造体をタプルに変換する手法を使用して、いくつかのスニペットから次を収集しましたが、配列がある場合、構造体は中かっこを省略して構造化することができますバインディングが正しくありません。C ++ 17でこれに対する回避策/その他のトリックはありますか?

struct data_t {
    int a;
    char b[2];
    bool c;
};

// data_t could be init as {x, y1, y2, z}...

template <class T, class... Args>
decltype(void(T{std::declval<Args>()...}), std::true_type{}) test_is_braces_constructible(int);

template <class, class...>
std::false_type test_is_braces_constructible(...);

template <class T, class... TArgs>
using is_braces_constructible = decltype(test_is_braces_constructible<T, TArgs...>(0));

struct any_type {
    template <class T>
    constexpr operator T(); // non explicit
};

template <class T>
auto to_tuple(T &&object) noexcept
{
    if constexpr (is_braces_constructible<T, any_type, any_type, any_type, any_type>{}) {
        // the object coming here...  the binding is incorrect
        auto &&[p1, p2, p3, p4] = object;
        return std::make_tuple(p1, p2, p3, p4);
    } else if constexpr (is_braces_constructible<T, any_type, any_type, any_type>{}) {
        auto &&[p1, p2, p3] = object;
        return std::make_tuple(p1, p2, p3);
    } else if constexpr (is_braces_constructible<T, any_type, any_type>{}) {
        auto &&[p1, p2] = object;
        return std::make_tuple(p1, p2);
    } else if constexpr (is_braces_constructible<T, any_type>{}) {
        auto &&[p1] = object;
        return std::make_tuple(p1);
    } else {
         return std::make_tuple();
    }
}
4

1 に答える 1