gpt4 book ai didi

C++ 访问者模式处理模板化字符串类型?

转载 作者:行者123 更新时间:2023-11-30 04:39:08 24 4
gpt4 key购买 nike

我正在尝试使用访问者模式来序列化对象的内容。然而,我遇到的一个障碍是当我访问字符串时。我的字符串是模板化类型,类似于 STL 的 basic_string。所以像这样:

basic_string<char_type, memory_allocator, other_possible_stuff> \\ many variations possible!

因为我可以有很多不同的模板化字符串类型,所以我不能将它们添加到我的访问者界面中。这将是荒谬的。但是我无法将模板添加到我的 VisitString 方法,因为 C++ 阻止在虚拟方法中使用模板参数。

那么我有什么选择可以解决这个问题?

编辑:我添加了一些基本代码

class IVisitor
{
public:
virtual void VisitString(some_kind_of_string_type string) = 0; // this is what I want in theory
};

class MyObject
{
public:
typedef basic_string<char8, myAllocator, some_flag> MyStringType;
Accept(IVisitor* visitor)
{
visitor->VisitString(mString);
}
private:
MyStringType string;
};

class MyOtherObject
{
public:
typedef basic_string<char16, myOtherAllocator, some_other_flag> MyOtherStringType;
Accept(IVisitor* visitor)
{
visitor->VisitString(mString);
}
private:
MyOtherStringType string;
};


class Reader : public IVisitor
{
public:
virtual void VisitString(some_kind_of_string_type string)
{
// read some data, give it to the string
}
}

最佳答案

你需要运行时多态性吗?

struct object {
template <typename Visitor>
void accept( Visitor & v )
{
v( x );
v( a );
}

int x;
std::string a;
};
struct complex_object {
template <typename Visitor>
void accept( Visitor & v ) {
v( i );
o.accept(v); // [1]
}
int i;
object1 o;
};

struct DumpScreenVisitor {
void operator()( int x ) { std::cout << x << std::endl; }
template <typename char_t, typename traits_t, typename alloc_t>
void operator()( std::basic_string<char_t, traits_t, alloc_t> const & str )
{
std::cout << str << std::endl;
}
};

[1] 中的调用可以转换为 v( o ),在访问者中使用通用模板化 operator() 是最不专业的:

template <typename O>
void DumpScreenVisitor::operator()( O & o )
{
o.accept( *this );
}

但这可能会与其他访问者实现交互(例如,上述访问者可以使用单个模板化方法实现):

struct DumpScreenVisitor {
template <typename T>
void operator()( T const & t ) {
std::cout << t << std::endl;
}
};

所以最后你将不得不以任何一种方式妥协。

这种方法类似于 boost::variant 访问者实现(您可能想看一看),不同之处在于 boost::variant 是单个类而不是层次结构。

关于C++ 访问者模式处理模板化字符串类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2555712/

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