如何将类模板参数传递给boost :: variant?

717

我有一个模板方法,使用boost :: get of boost:variant模块:

typedef boost::variant<int, std::string, bool, uint8_t> Variant;

template <class T>
void write(const Variant& t) {
    size_t sizeT = boost::apply_visitor(SizeOfVisitor(), t);
    memcpy(&v[offset], &boost::get<T>(t), sizeT);
}

问题是我只在运行时才知道Variant的基础类型。而且AFAIK我只能使用which()method进行查询

有什么方法可以传递类型T,它是此方法的基本Variant类型?例如,使用which()我不知道的类型是什么,但是如何传递呢?

switch (m_var.which()) { // Returns an int index of types in the order of passed template classes
    case 0: // This is int
    case 1: // This is std::string
    ...
}
...
Writer.write<???>(m_var); // How to pass the type here?

编辑:如果您知道任何其他方式来获得所需的结果-实际获取boost :: variant内部变量的地址,要从那里复制,请与我分享您的想法

谢谢

我碰巧在这里写了一个非常相似的答案:

同样,最重要的是与非POD数据类型一起使用完全是伪造的memcpy(因此您不能std::string.ever一起使用)。

variant使用仅在运行时已知的类型对进行操作的方法是使用boost::static_visitor<>

这是经过main()改编的示例,很接近您想要实现的目标,显然,

Live On Coliru

#include <boost/variant.hpp>
#include <boost/bind.hpp>

#include <boost/array.hpp> // just as a sample
#include <iostream>

namespace serialization {

    namespace customization {
        template<typename T, typename Out, typename R = typename boost::enable_if<boost::is_pod<T>, void>::type>
            void do_serialize(T const& x, Out& out)
            {
                static_assert(boost::is_pod<T>(), "");
                char const* rawp = reinterpret_cast<char const*>(&x);
                std::copy(rawp, rawp+sizeof(T), out);
            }

        template<typename Out>
            void do_serialize(std::string const& x, Out& out)
            {
                do_serialize(x.size(), out);
                for(auto ch : x)
                    do_serialize(ch, out);
            }
    }

    struct serialize_f : public boost::static_visitor<> {
        template<typename Out, typename... T>
            void operator()(boost::variant<T...> const& v, Out& out) const
            {
                boost::apply_visitor(boost::bind(*this, _1, boost::ref(out)), v);
            }

        template<typename T, typename Out>
            void operator()(T const& x, Out& out) const
            {
                using customization::do_serialize; // ADL dispatch
                do_serialize(x, out);
            }
    };

    template <typename T, typename Out>
        Out serialize(T const& v, Out out) {
            const static serialize_f _vis {};
            _vis(v, out);
            return out;
        }

}

namespace MyUserTypes {

    struct A {
        std::string name;
        int i;
    };

    template<typename Out> void do_serialize(A const& v, Out& out) { // ADL will find this
        serialization::serialize(v.name, out);
        serialization::serialize(v.i, out);
    }
}

int main() {
    using namespace serialization;
    std::vector<uint8_t> binary_data;
    auto out_inserter = back_inserter(binary_data);

    // variants and custom types
    typedef boost::variant<MyUserTypes::A, boost::array<char, 42> > V;
    MyUserTypes::A myA { "0123456789", 99 };
    V v = boost::array<char,42>();

    serialize(myA, out_inserter);
    serialize(v, out_inserter);
    v = myA;
    serialize(v, out_inserter);

    std::cout << "Bytes in binary_data vector: " << binary_data.size() << "\n";
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何为模板化类检索boost :: variant值

来自分类Dev

如何将模板类的名称传递给模板参数?

来自分类Dev

如何将当前替代类型的 std::variant 传递给可调用对象?

来自分类Dev

增量boost :: variant值

来自分类Dev

Boost-variant的向量

来自分类Dev

从boost :: variant检索对象

来自分类Dev

增量boost :: variant值

来自分类Dev

如何将参数传递给使用模板的类

来自分类Dev

std :: variant的参数归纳

来自分类Dev

如何将“double”转换为“VARIANT”

来自分类Dev

boost :: variant和operator <<重载

来自分类Dev

boost :: variant作为朋友课程

来自分类Dev

Boost :: variant的多态设置器

来自分类Dev

从istream读取boost :: variant类型

来自分类Dev

std::variant 是否提供类似于 boost::variant<>::types 的功能?

来自分类Dev

将std :: variant的包装器的std :: vector传递给可变参数类,在不知道具体细节的情况下包装可变参数方法

来自分类Dev

如何为std :: variant赋值?

来自分类Dev

创建一个Variant类和std :: map <Variant,Variant>

来自分类Dev

如何将variant <Ts ...>的值移动到variant <T,Ts ...>中?

来自分类Dev

如何将 Boost Variant 与 struct 对象一起使用 C++

来自分类Dev

如何使用可变参数模板将std :: variant与std :: visit一起进行?

来自分类Dev

将Boost Spirit解析器从boost :: variant过渡到std :: variant 2

来自分类Dev

具有X类,如何将X作为模板参数传递给自身?

来自分类Dev

如何将variant的元素转换为std :: string(c ++)

来自分类Dev

boost :: variant。boost :: visitor重载功能

来自分类Dev

boost :: variant。boost :: visitor重载功能

来自分类Dev

如何将模板化类实例作为模板参数传递给另一个模板?

来自分类Dev

如何将函数参数传递给boost :: async()

来自分类Dev

如何将参数传递给流星中的模板事件?

Related 相关文章

  1. 1

    如何为模板化类检索boost :: variant值

  2. 2

    如何将模板类的名称传递给模板参数?

  3. 3

    如何将当前替代类型的 std::variant 传递给可调用对象?

  4. 4

    增量boost :: variant值

  5. 5

    Boost-variant的向量

  6. 6

    从boost :: variant检索对象

  7. 7

    增量boost :: variant值

  8. 8

    如何将参数传递给使用模板的类

  9. 9

    std :: variant的参数归纳

  10. 10

    如何将“double”转换为“VARIANT”

  11. 11

    boost :: variant和operator <<重载

  12. 12

    boost :: variant作为朋友课程

  13. 13

    Boost :: variant的多态设置器

  14. 14

    从istream读取boost :: variant类型

  15. 15

    std::variant 是否提供类似于 boost::variant<>::types 的功能?

  16. 16

    将std :: variant的包装器的std :: vector传递给可变参数类,在不知道具体细节的情况下包装可变参数方法

  17. 17

    如何为std :: variant赋值?

  18. 18

    创建一个Variant类和std :: map <Variant,Variant>

  19. 19

    如何将variant <Ts ...>的值移动到variant <T,Ts ...>中?

  20. 20

    如何将 Boost Variant 与 struct 对象一起使用 C++

  21. 21

    如何使用可变参数模板将std :: variant与std :: visit一起进行?

  22. 22

    将Boost Spirit解析器从boost :: variant过渡到std :: variant 2

  23. 23

    具有X类,如何将X作为模板参数传递给自身?

  24. 24

    如何将variant的元素转换为std :: string(c ++)

  25. 25

    boost :: variant。boost :: visitor重载功能

  26. 26

    boost :: variant。boost :: visitor重载功能

  27. 27

    如何将模板化类实例作为模板参数传递给另一个模板?

  28. 28

    如何将函数参数传递给boost :: async()

  29. 29

    如何将参数传递给流星中的模板事件?

热门标签

归档