2017-08-22 32 views
3

有没有办法获得一个类的字段数?得到一个类中的字段数

struct Base { 
    char a; 
    int b; 
}; 

struct Derived : Base { 
    std::string c; 
}; 

static_assert(num_fields<Base>::value == 2); 
static_assert(num_fields<Derived>::value == 1); 

我发现this question但它是非常过时的 - 我希望能找到一些缝有C++十七分之十四在一起(毕竟我们现在有一些像magic_get - 也许是从它的一些子集.. 。?)

编辑: - 编译器钩也将工作,即使它只是为MSVC或GCC或锵 - 我使用所有3

+5

这是什么用例?也许可以有不同的解决方案 –

+1

我所知道的并不涉及宏观功夫。当你需要迭代或计算字段时,我建议使用'std :: tuple'。 – AMA

+0

C++不能像那样工作。有趣的是,最近出现了很多这样的问题。 – kim366

回答

3

事实上,Antony Polukhin向我们证明了C++ does有反射,因为C++ 14不知道它;并且您可以提取有关这些字段的信息。 ...至少对于普通的旧数据结构/类来说。看他的CppCon 2016的谈话:

C++14 Reflections Without Macros, Markup nor External Tooling/Antony Polukhin

然后你写:

template <class T, std::size_t I0, std::size_t... I> 
constexpr auto detect_fields_count(std::size_t& out, std::index_sequence<I0, I...>) 
    -> decltype(T{ ubiq_constructor<I0>{}, ubiq_constructor<I>{}... }) 
{ out = sizeof...(I) + 1;  /*...*/ } 

template <class T, std::size_t... I> 
constexpr void detect_fields_count(std::size_t& out, std::index_sequence<I...>) { 
    detect_fields_count<T>(out, std::make_index_sequence<sizeof...(I) - 1>{}); 
} 

它可以让你的场数。当然,你也需要巧妙构想的ubiq结构。你真正需要使用这两个文件:

https://github.com/apolukhin/magic_get/blob/develop/include/boost/pfr/detail/config.hpp
https://github.com/apolukhin/magic_get/blob/develop/include/boost/pfr/detail/fields_count.hpp

这应该是足够的。

+0

你认为有可能使它与私人领域一起工作吗?这使得一个类型**不可聚合初始化**,但也许通过朋友的一些constexpr函数或结构特征类......? – onqtam

+0

@onqtam:我怀疑它,但 - 我不是一个疯狂的俄罗斯天才,所以谁知道... – einpoklum

+1

这也不适用于'派生';它不是一个聚合,因为它有一个基类,因此[不能被聚合初始化](https://stackoverflow.com/questions/23808357/brace-initialization-for-inherited-pod)。 – rustyx

7

你不能做到这一点(开箱即用)因为在C++中还没有反射。您需要探索其他选项,例如第三方库。

+0

*“您无法做到这一点(开箱即用),因为在C++中没有任何反射。“* - 我希望这个语句以**”yet“**结尾,因为有持续的努力来提供某种形式的...也许我们会看到一些C++ 20 ?? C++ 23 ??? – WhiZTiM

+2

你*可以*用TMP做到这一点。看看[magic_get](https://github.com/apolukhin/magic_get)和[结构化绑定](http://en.cppreference.com/w/cpp/language/structured_binding)。 – rustyx

+1

Ron:O RLY?其实,你绝对可以做到这一点。而C++确实有反射(它现在还不知道它......);看到我的答案。 – einpoklum

相关问题