gpt4 book ai didi

c++ - 持有 boost 枚举的基类指针

转载 作者:行者123 更新时间:2023-11-30 04:40:07 28 4
gpt4 key购买 nike

目前,我正在使用来自 Boost Vault 的类型安全枚举类:

Which Typesafe Enum in C++ Are You Using?

我发现很难有一个父类指针来引用所有枚举类,因为 Boost::enum 是一个模板类:boost::detail::enum_base<T>

我正在使用 void fun(const boost::any& any) , 接受任何枚举类。但是,我需要在执行迭代之前将它们转换为枚举类。我无法转换为基类 boost::detail::enum_base<T> ,因为我没有关于 T 将是什么的信息。

关于如何解决这个问题有什么建议吗?

其中一个要求是,函数参数必须在 boost::any 中。

#include <iostream>
#include <boost/any.hpp>
#include "boost/enum.hpp"


// this macro
BOOST_ENUM(boolean,
(True)
(False)
)

// expands to this enum model
namespace expanded
{
class boolean : public boost::detail::enum_base<boolean>
{
public:
enum domain
{
False,
True,
};

BOOST_STATIC_CONSTANT(index_type, size = 2);

public:
boolean() {}
boolean(domain index) : boost::detail::enum_base<boolean>(index) {}

typedef boost::optional<boolean> optional;
static optional get_by_name(const char* str)
{
if(strcmp(str, "False") == 0) return optional(False);
if(strcmp(str, "True") == 0) return optional(True);
return optional();
}

private:
friend class boost::detail::enum_base<boolean>;
static const char* names(domain index)
{
BOOST_ASSERT(static_cast<index_type>(index) < size);
switch(index)
{
case False: return "False";
case True: return "True";
default: return "";
}
}
};
}

BOOST_ENUM(boolean2,
(True2)
(False2)
)

/* I want to have a function to accept any enum class. How? */
void fun(const boost::any& any)
{
/* How about boolean2 enum? How can I have a common pointer to point to enum class? */
const boolean* d = boost::any_cast<boolean *>(any);

/* I want to use unofficial boost::enum, because it allows me to iterate through enum's members. */
for (boolean::const_iterator iterator = d->begin(); iterator != d->end(); iterator++)
{
boolean x = *iterator;
std::cout<< "Iterate through enum : "<< x<< std::endl;
}
}


int main()
{
boolean b = boolean::True;
boolean2 b2 = boolean2::True2;

/* Assume until this stage, during runtime, I have no clue b is either boolean or boolean2. */
fun(&b);
/*
* Runtime error occur here.
* throw enable_current_exception(enable_error_info(e));
*/
fun(&b2);

getchar();
}

最佳答案

如果不能通过基类访问,使用函数模板:

template<class TE> // should be a boost enum
void fun(TE& en)
{
for (TE::const_iterator it = en.begin(); it != en.end(); ++it)
{
/* ... */
}
}

关于公共(public)基指针:
您不能按照定义 boost 枚举的方式使用其中之一。它没有单个基类,而是每个枚举类型和每个(可选)值类型都有单独的基类。
此外,boost enum 的要点是静态类型安全 - 如果您要求的是基于运行时决策的不同枚举类型,那么您使用的是错误的工具。

更新:
如果你真的有不可变的要求,你可以基于 boost::any::type 的显式转换,例如(利用上面给出的函数模板):

const std::type_info& ti = any.type();
if(ti == typeid(boolean*)) {
fun(*boost::any_cast<boolean*>(any));
} else if(ti == typeid(boolean2*)) {
/* ... */
}

关于c++ - 持有 boost 枚举的基类指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1778191/

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