gpt4 book ai didi

c++ - 确定结构是否具有特定类型的成员

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:47:29 25 4
gpt4 key购买 nike

假设我有一个结构 Foo,我想确定 Foo 中是否有一个 int

struct Foo { int a; char c; };
has_int<Foo>::value; // should be true

这是我真正想要的最基本形式,检查特定类型:

has_type<Foo, int>::value;

如果我知道如何执行上述操作,我可以将其转换为我的最终目标:

has_pointer<Foo>::value; // false
struct Bar { int a; void *b; };
has_pointer<Bar>::value; // true

至于我尝试过的,很难开始,我能想到的最好的是,如果我能得到一个结构中包含的类型的包,我可以写剩下的:

template <typename... Ts>
constexpr bool any_is_pointer() noexcept {
return (... || std::is_pointer_v<Ts>);
}

我所要求的似乎很可能是不可能的。我找不到拷贝,但令我惊讶的是我找不到,所以它可能就在那里。

最佳答案

正如其他人所说,对于任意类型,您现在想要的东西对于普通 C++ 是不可能的。但是,如果您能够提供特定的编译时信息以及您需要在其定义中操作的类型,您就可以做您想做的事。

您可以使用 boost 融合库的适配器来执行此操作,它允许您调整现有结构以成为融合容器或定义为融合容器建模的新结构。然后,您可以使用您想要的任何 boost::mpl 算法来执行您想要执行的编译时检查类型。

考虑这个例子,使用你的 struct foo 和你想要的 has_type 编译时算法:

#include <boost/fusion/adapted/struct/define_struct.hpp>
#include <boost/mpl/contains.hpp>

BOOST_FUSION_DEFINE_STRUCT(
(your_namespace), foo,
(int, a)
(char, c))

template<typename source_type, typename search_type>
struct has_type
{
typedef typename boost::mpl::contains<source_type, search_type>::type value_type;
static const bool value = value_type::value;
};

#include <iostream>

int main()
{
bool foo_has_int_pointer = has_type<your_namespace::foo, int*>::value;
bool foo_has_int = has_type<your_namespace::foo, int>::value;

std::cout << "foo_has_int_pointer: " << foo_has_int_pointer << "\n";
std::cout << "foo_has_int: " << foo_has_int << "\n";

your_namespace::foo my_foo;

my_foo.a = 10;
my_foo.c = 'x';

std::cout << "my_foo: " << my_foo.a << ", " << my_foo.c;
}

在此处查看输出或混淆示例:http://ideone.com/f0Zc2M

如您所见,您使用 BOOST_FUSION_DEFINE_STRUCT 宏来定义您希望在编译时对其成员进行操作的 struct。 fusion 提供了几个其他宏来定义这样的结构,以及用于调整已经定义的结构的宏。检查一下 here .

当然,您可能已经知道这里的缺点。 has_type 仅在 source_type 是 boost::mpl/boost::fusion 序列时才有效。对于您来说,这意味着您想要在编译时以这种方式推理的任何类型,都需要使用宏来定义或修改。如果您正在编写旨在用于任意库用户定义类型的库,这可能对您来说是 Not Acceptable 。

关于c++ - 确定结构是否具有特定类型的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32791440/

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