C++ C++;:是否可以编写一个函数,将不同类型的元素附加到变量数组中?

C++ C++;:是否可以编写一个函数,将不同类型的元素附加到变量数组中?,c++,c++17,template-meta-programming,variant,C++,C++17,Template Meta Programming,Variant,我正在尝试编写一个函数,例如,它将采用: std::array 和a双d,并返回: std::array 将d附加到数组的末尾,但到目前为止,我在实现中遇到了一些非常奇怪的行为 现在,我有了一个Variant\u Monoid(使用二进制操作连接)来处理扩展std::Variant类型,它似乎工作正常: struct Variant_Monoid { using zero = std::monostate; template <typename T, typename..

我正在尝试编写一个函数,例如,它将采用:

std::array

和a
双d
,并返回:

std::array

d
附加到数组的末尾,但到目前为止,我在实现中遇到了一些非常奇怪的行为

现在,我有了一个
Variant\u Monoid
(使用二进制操作
连接
)来处理扩展
std::Variant
类型,它似乎工作正常:

struct Variant_Monoid {
    using zero = std::monostate;

    template <typename T, typename... Args>
    struct [[maybe_unused]] concatenate;

    template <typename... Args0, typename... Args1>
    struct concatenate<std::variant<Args0...>, std::variant<Args1...>> {
        using type = std::variant<Args0..., Args1...>;
    };

    // Convenience method to concatenate types without having to wrap them into a variant first.
    template<typename... Args0, typename... Args1>
    struct concatenate<std::variant<Args0...>, Args1...> {
        using type = std::variant<Args0..., Args1...>;
    };
};
类似地,这似乎毫无问题:

constexpr std::array<std::variant<std::string_view>, 3> to_extend = {{"Hello", "there", "world"}};
constexpr std::array<std::variant<std::string_view, int>, 4> extended = append_element_with_type(to_extend, 5);

如有任何建议/帮助,将不胜感激。我对模板元编程还是相当陌生,只是想了解更多。

对访问者的调用必须为所有可能的参数生成相同的类型和值类别。显式地将lambda的返回类型指定为新变量,即
typename variant\u Monoid::concatenate::type

非常好。非常感谢。这正是我需要做的。
template<size_t N, typename T, typename S, size_t... Indices>
constexpr std::array<typename Variant_Monoid::concatenate<T, S>::type, N + 1>
append_element_with_type_aux(const std::array<T, N> &a,
                             const S &s, std::index_sequence<Indices...>) noexcept {
    return {{std::visit([](auto &&t) { return t; }, a[Indices])..., s}};
}
constexpr std::array<std::variant<Variant_Monoid::zero>, 0> s0{};
constexpr std::array<std::variant<Variant_Monoid::zero, int>, 1> s1 = append_element_with_type(s0, 1);
auto s2 = append_element_with_type(s1, 3.14159);
constexpr std::array<std::variant<std::string_view>, 3> to_extend = {{"Hello", "there", "world"}};
constexpr std::array<std::variant<std::string_view, int>, 4> extended = append_element_with_type(to_extend, 5);
constexpr std::array<std::variant<std::string_view, int, double>, 5> prepended = append_element_with_type(extended, 3.14);