gpt4 book ai didi

c++ - 如何在 C++ 中实现基本 Variant(以及 Variant 上的访问者)模板?

转载 作者:搜寻专家 更新时间:2023-10-31 02:00:22 25 4
gpt4 key购买 nike

我试过阅读:

http://www.boost.org/doc/libs/1_41_0/boost/variant.hpp


http://www.codeproject.com/KB/cpp/TTLTyplist.aspx


and chapter 3 of "Modern C++ Design"

但仍然不明白变体是如何实现的。任何人都可以粘贴一个简短的例子来说明如何定义类似的东西:

class Foo {
void process(Type1) { ... };
void process(Type2) { ... };
};


Variant<Type1, Type2> v;

v.somethingToSetupType1 ...;

somethingToTrigger process(Type1);

v.somethingToSetupType2 ...;

somethingToTrigger process(Type2);

谢谢!

最佳答案

如果我必须定义一个变体对象,我可能会从以下开始:

template<typename Type1, typename Type2>
class VariantVisitor;

template<typename Type1, typename Type2>
class Variant
{
public:
friend class VariantVisitor<Type1, Type2>;
Variant();
Variant(Type1);
Variant(Type2);
// + appropriate operators =
~Variant(); // deal with memory management

private:
int type; // 0 for invalid data, 1 for Type1, 2 for Type2
void* data;
};

template<typename Visitor, typename Type1, typename Type2>
class VariantVisitor
{
private:
Visitor _customVisitor;
public:
void doVisit(Variant<Type1, Type2>& v)
{
if( v.type == 1 )
{
_customVisitor( *(Type1*)(v.data));
}
else if( v.type == 2 )
{
_customVisitor( *(Type2*)(v.data));
}
else
{
// deal with empty variant
}
}
};
template<typename Visitor, typename Type1, typename Type2>
void visit( Visitor visitor, Variant<Type1, Type2> v )
{
VariantVisitor<Visitor, Type1, Type2>(visitor).doVisit(v);
}

然后使用 MPL vectors使该方法不仅适用于两种不同的类型。

最后,你可以这样写:

Variant<Type1, Type2> v;
class MyVisitor
{
public:
operator()(Type1);
operator()(Type2);
};

MyVisitor visitor;
v = Type1();
visit(visitor, v);
v = Type2();
visit(visitor, v);

注意:这段代码不可能编译,但这描述了我要使用的想法。

关于c++ - 如何在 C++ 中实现基本 Variant(以及 Variant 上的访问者)模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2131604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com