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

C++ 确定结构是否具有特定类型的成员,c++,templates,c++11,template-meta-programming,sfinae,C++,Templates,C++11,Template Meta Programming,Sfinae,假设我有一个结构Foo,我想确定Foo里面是否有int struct Foo { int a; char c; }; has_int<Foo>::value; // should be true structfoo{inta;charc;}; has_int::value;//应该是真的 这是我真正想要的最基本的形式,检查特定类型: has_type<Foo, int>::value; 具有_type::value; 如果我知道如何实现上述目标,我可以将其转化为我

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

struct Foo { int a; char c; };
has_int<Foo>::value; // should be true
structfoo{inta;charc;};
has_int::value;//应该是真的
这是我真正想要的最基本的形式,检查特定类型:

has_type<Foo, int>::value;
具有_type::value;
如果我知道如何实现上述目标,我可以将其转化为我的最终目标:

has_pointer<Foo>::value; // false
struct Bar { int a; void *b; };
has_pointer<Bar>::value; // true
具有\u指针::值;//假的
结构条{inta;void*b;};
has_指针::value;//真的
至于我已经尝试过的,很难开始,我能想到的最好的方法是,如果我能得到一个结构中包含的一组类型,我可以编写其余的:

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

我所要求的似乎很可能是不可能的。我找不到一个副本,但我很惊讶我不能这么做,因为其他人已经说过了,你现在想要的是不可能的,用香草C++任意类型。但是,如果您能够提供特定的编译时信息以及需要在其定义中对其进行操作的类型,那么您可以做您正试图做的事情

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

考虑此示例,使用您的
struct foo
,您所需的
具有\u 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;
}
#包括
#包括
BOOST\u FUSION\u DEFINE\u STRUCT(
(你的名字空间),foo,
(国际,a)
(char,c))
模板
结构具有\u类型
{
typedef typename boost::mpl::contains::type value\u type;
静态常量布尔值=值\类型::值;
};
#包括
int main()
{
bool foo_has_int_pointer=has_type::value;
bool foo_has_int=has_type::value;

STD::这是不可能的,C++没有反射。但是,对于C++之类的东西来说,它是非常简单的::tuple 。基本上,你需要反射。C++不做反射。但是我不禁想:假设你设法实现了<代码> HasyIt。你打算怎么用它?你真正的问题是什么?你在试图解决吗?@IgorTandetnik我现在的情况是,包含指针或引用的结构需要小心处理。关键是要决定在编译时允许哪些操作。我真的无法详细解释。我对内置的东西一无所知。在运行时你不需要它,所以你考虑过第三个专业人士吗gram解析文件并生成适当的源代码,该源代码将与程序的其余部分一起编译?在获得静态反射方案之前,请检查以下内容: